BufferOverflow - 无法在堆栈上推送特定的返回地址

逆向工程 缓冲区溢出 罗普
2021-06-15 20:51:56

我目前正在处理缓冲区溢出和 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

我在这里错过了什么?

2个回答

从表面上看,如果 0xee 像那样被截断,它就是一个坏字符。您首先应该做的是寻找坏字符,完成后,您就会知道可以使用和不可以使用的小工具。

如果那是唯一的小工具,我会研究做同样事情的替代品。因此,在 eax 中弹出一个随机数,添加一个偏移量,然后如果它是某种类型的调用,eax 就会有你想要的东西。类似的东西

我还不能发表评论,但问题可能是过滤或停止阅读每个字符的功能。问题也可能来自您如何远程发送这些数据。