gdb调试
- gdb设置断点时,断点处的语句是程序被断时还未执行
- x/x <address>:十六进制输出该地址的值
- vmmap:输出段表
- got:输出got表
- 查看格式化字符串偏移的调试方法:printf()设置断点,输入AAAA%p%p%p%p%p%p%p…,查看栈中字符串的位置,对比栈基位置(一个地址32位4字节 64位8字节)可计算得出
- fmtarg <address>:计算格式化字符串输出函数的栈上地址与函数的格式化字符串的偏移
输出got表上的对应地址的内容要删除第一个字节?
64位中的参数寄存器依次是:rdi,rsi,rdx,rcx,r8,r9
关于ctfwiki上的fmtstr阅读的注意点:栈上的偏移是以一个地址大小作为单位的,地址的偏移是以字节作为单位的
注意:64位的参数偏移要先加入六个寄存器的6个偏移再计算其他
我们一般默认远程都是开启 ASLR 保护的。
void bzero(void *s, int n)
参数说明:s 要置零的数据的起始地址; n 要置零的数据字节个数。
今日疑问:
为什么pwn3这题的字符串偏移明明是7 还要使用8来偏移
他是这样解释的:
我在获取 puts 函数地址时使用的偏移是 8,这是因为我希望我输出的前 4 个字节就是 puts 函数的地址。
其实格式化字符串的首地址的偏移是 7