GDB ret“无法访问地址内存”

时间:2013-10-21 23:02:30

标签: assembly gdb stack

简单地说:

  1. 堆栈顶部($esp) = 0xbffff49c
  2. gdb执行ret指令,该指令以Cannot access memory at address 0x90909094响应。
  3. 当堆栈顶部的值为0x90909094时,gdb会尝试访问0xbffff49c的原因是什么?

    随机信息(如果需要):

    [----------------------------------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试图访问不在顶部的数据堆栈?

1 个答案:

答案 0 :(得分:4)

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

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

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

编辑:实际上我现在认为访问违规发生在leave指令内,ret从未执行过。 leave也尝试pop ebp,我认为存在访问冲突。

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