格式化字符串基础
%p、%x 泄露数据
1 | printf("a1 = %d, a2 = %d, a3 = %d", a1, a2, a3); |
%x$ 指定位置参数
1 | printf("%5$p"); |
%n 更改指定位置存储的值所指向的值
- %n
- 将指定位置指向的值修改为前面所输出的字符个数
1 |
|
指针1 —> 值
指针2 -> 指针1
%c 输出特定数量字符
1 | printf("%8c); |
format
泄露libc
泄露pie
泄露canary
泄露堆
*更改任意数据
栈上格式化字符串
更改数据方便,1次printf调用就能更改数据
非栈上格式化字符串
更改一个任意数据很可能需要调用两次printf或者%n
如果format长度很长,就可以用两次%n来更改数据,如果很短,就需要两次printf
