【问题标题】:GDB ret "cannot access memory at address"GDB ret“无法访问地址处的内存”
【发布时间】:2013-10-30 15:25:27
【问题描述】:

简单地说:

  1. 栈顶($esp) = 0xbffff49c
  2. gdb 执行ret 指令,该指令以Cannot access memory at address 0x90909094 响应。

当堆栈顶部的值为0xbffff49c 时,gdb 尝试访问0x90909094 的原因是什么?

随机信息(以备不时之需):

[----------------------------------registers-----------------------------------]
EAX: 0x5a ('Z')
EBX: 0xb7fbeff4 --> 0x15ed7c 
ECX: 0xbffff428 --> 0xb7fbf4e0 --> 0xfbad2a84 
EDX: 0xb7fc0360 --> 0x0 
ESI: 0x0
EDI: 0x0 
EBP: 0x90909090 
ESP: 0xbffff49c --> 0xbffff450 --> 0xdb31c031 
EIP: 0x80485dd (<greeting+113>: ret)
EFLAGS: 0x292 (carry parity ADJUST zero SIGN trap INTERRUPT direction overflow)
[-------------------------------------code-------------------------------------]
   0x80485d0 <greeting+100>:    mov    DWORD PTR [esp],0x80487f4
   0x80485d7 <greeting+107>:    call   0x80483f0 <printf@plt>
   0x80485dc <greeting+112>:    leave  
=> 0x80485dd <greeting+113>:    ret    
   0x80485de <checkPassword>:   push   ebp
   0x80485df <checkPassword+1>: mov    ebp,esp
   0x80485e1 <checkPassword+3>: push   ebx
   0x80485e2 <checkPassword+4>: sub    esp,0x64
[------------------------------------stack-------------------------------------]
0000| 0xbffff49c --> 0xbffff450 --> 0xdb31c031 
0004| 0xbffff4a0 --> 0x0 
0008| 0xbffff4a4 --> 0xbffff564 --> 0xbffff6b2 ("/root/Desktop/CSCE_526/task1")
0012| 0xbffff4a8 --> 0x804876b (<__libc_csu_init+11>:   add    ebx,0x1351)
0016| 0xbffff4ac --> 0xb7fbeff4 --> 0x15ed7c 
0020| 0xbffff4b0 --> 0x8048760 (<__libc_csu_init>:  push   ebp)
0024| 0xbffff4b4 --> 0x0 
0028| 0xbffff4b8 --> 0xbffff538 --> 0x0 
[------------------------------------------------------------------------------]
gdb-peda$ n
Cannot access memory at address 0x90909094

我正在溢出缓冲区并试图让它执行一些 shellcode,但考虑到问题的简单性,我不确定这些细节是否相关:为什么 ret 试图访问不在顶部的数据堆栈?

【问题讨论】:

    标签: assembly gdb stack


    【解决方案1】:

    在我看来,您的调试器在 leave 指令之后没有显示寄存器状态,而是在它之前。

    我相信leave 确实是esp = ebp,这是有道理的,因为它无法访问的地址是存储在 ebp 中的地址之后的一个字。

    所以我认为问题不在于ret 的目的地,而是在ret 访问堆栈以检索其返回地址时发生。

    编辑:实际上我现在认为访问冲突发生在 leave 指令中,而 ret 根本不会执行。 leave 也尝试 pop ebp 并且我认为存在访问冲突。

    在此处查看有关leave 的一些信息:Why does leave do "mov esp,ebp" in x86 assembly?

    【讨论】:

    • 是的,我更改了我的有效负载以使用合法地址而不是 nops 填充 EBP,并且它在 GDB 中工作。不过奇怪的行为,如果我在 GDB 中运行它而没有任何中断,它可以正常工作;如果我通过“./prog cat payload”运行它,那么它会出现段错误。 “./prog perl shellGenerate.pl” 也是如此
    猜你喜欢
    • 2018-09-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-11-06
    • 2013-02-18
    • 1970-01-01
    相关资源
    最近更新 更多