我目前正在处理缓冲区溢出和 ROP 链,但我正面临一种我不知道如何处理的奇怪行为。
我不知道为什么,但我无法正确地将我的第一个 ROP 小工具的地址推送到堆栈中。
对于我试图利用的特定二进制文件,我必须在覆盖指令指针之前填充 28 字节的缓冲区。
如果我进行以下测试,一切似乎都井然有序:
gdb-peda$ run < <(python -c 'print("A"*28 + "BBBB")')
[...]
> Stopped reason: SIGSEGV
> 0x42424242 in ?? ()
我的第一个小工具位于地址“ 0x0806ee6b ”。
但是当我尝试以下测试时,我的输入和推送到堆栈上的内容之间存在差异:
gdb-peda$ run < <(python -c 'print("A"*28 + "\x6b\xee\x06\x08")')
[...]
> Stopped reason: SIGSEGV
> 0x06aec36b in ?? ()
如果我查看触发缓冲区溢出的retn指令之前的堆栈,我的小印度格式地址不再相同:
gdb-peda$ x/50x $esp
0xffffdaec: 0x06aec36b 0x00000008 0x0804f02b 0x080da000
如果我尝试推送任意地址,例如“ 0x08064141 ”,则一切正常:
gdb-peda$ run < <(python -c 'print("A"*28 + "\x41\x41\x06\x08")')
[...]
gdb-peda$ x/50x $esp
0xffffdaec: 0x08064141 0x00000000 0x0804f02b 0x080da000
我尝试了一些曲折,看看情况如何,但结果仍然相同。当压入堆栈时,“ \xee ”总是被翻译成“ \xae\xc3 ”。对于其他一些特定地址也是如此。
我真的不明白,我可以推送地址 0x0806 5e 6b 没有任何问题:
gdb-peda$ run < <(python -c 'print("A"*28 + "\x6b\x5e\x06\x08")')
[...]
gdb-peda$ x/10x $esp
0xffffdaec: 0x08065e6b 0x00000000 0x0804f02b 0x080da000
但不是地址 0x0806 ee 6b:
gdb-peda$ run < <(python -c 'print("A"*28 + "\x6b\xee\x06\x08")')
[...]
gdb-peda$ x/10x $esp
0xffffdaec: 0x06aec36b 0x00000008 0x0804f02b 0x080da000
我在这里错过了什么?