栈溢出计算偏移量
一,GDB调试出偏移量
0x8048677 <main+95> lea eax, [esp + 0x1c]
0x804867b <main+99> mov dword ptr [esp], eax
► 0x804867e <main+102> call gets@plt
通过这一串汇编指令可以看出来,此时起始地址相对于esp的偏移为0x1c,只要查看这时候的esp和ebp的寄存器就可以知道偏移量为多少。
EBP 0xffffcfb8 ◂— 0x0
ESP 0xffffcf30 —▸ 0xffffcf4c ◂— 0x0
这里就可以算出来起始地址相对于返回地址的偏移为0xffffcfb8 - 0xffffcf30 - 0x1c + 4。为112。这里的加四为ebp的值,在返回地址前还有一个ebp的值也要覆盖。
二,GDB-peda计算偏移量
-
使用gdb运行程序
gdb ./pwn
-
生成溢出字符串
($gdb-peda) pattern create 200
长度需要保证可以溢出覆盖至RIP
-
运行至输入点
($gdb-peda) c
输入生成的溢出字符串,回车后报错
复制栈顶前四个字节(64 bits为前8个字节)
-
计算偏移量
($gdb-peda) pattern offset [xxxx]
偏移量显示出来后,重新运行程序至输入点,输入offset‘A’,然后回车至报错停下,查看是否为预期的ebp被覆盖、eip正常,根据结果调整offset的长度*。算出来的偏移不一定对,以调试的为准。
三,PWNtools—cyclic计算偏移量
# 生成132个字符
$ cyclic 132
aaaabaaacaaadaaaeaaafaaagaaahaaaiaaajaaakaaalaaamaaanaaaoaaapaaaqaaaraaasaaataaauaaavaaawaaaxaaayaaazaabbaabcaabdaabeaabfaabgaabhaab
# 报错
$ ./level0
Hello, World
aaaabaaacaaadaaaeaaafaaagaaahaaaiaaajaaakaaalaaamaaanaaaoaaapaaaqaaaraaasaaataaauaaavaaawaaaxaaayaaazaabbaabcaabdaabeaabfaabgaabhaab
zsh: segmentation fault ./level0
# 查看长度
$ cyclic -l haab
128
cycli是pwntools的工具,但是算出来的偏移量不一定对,以gdb调试的为准。
四,利用ida计算偏移量
-00000064 s db 100 dup(?)
+00000000 s db 4 dup(?)
+00000004 r db 4 dup(?)
+00000008 argc dd ?
+0000000C argv dd ? ; offset
+00000010 envp dd ? ; offset
用返回地址减去起始地址求得偏移量,这里s相对于返回地址得偏移量为0x68,但是这里面计算出来得偏移量可能是不对的。最好还是以调试出来的偏移量为准。