Assembly GDB ret";无法访问地址“处的内存”;

Assembly GDB ret";无法访问地址“处的内存”;,assembly,gdb,stack,Assembly,Gdb,Stack,简言之: 堆栈顶部($esp)=0xbffff49c gdb执行ret指令,该指令响应无法访问地址0x9094处的内存 当堆栈顶部的值为0xbfff49c时,gdb试图访问0x909094的原因是什么 随机信息(如果需要): [---------------------------------------寄存器-----------------------------------------] EAX:0x5a('Z') EBX:0xb7fbeff4-->0x15ed7c ECX:0xbffff

简言之:

  • 堆栈顶部
    ($esp)=0xbffff49c
  • gdb执行
    ret
    指令,该指令响应
    无法访问地址0x9094处的内存
  • 当堆栈顶部的值为
    0xbfff49c
    时,gdb试图访问
    0x909094
    的原因是什么

    随机信息(如果需要):

    [---------------------------------------寄存器-----------------------------------------]
    EAX:0x5a('Z')
    EBX:0xb7fbeff4-->0x15ed7c
    ECX:0xbffff428-->0xb7fbf4e0-->0xfbad2a84
    EDX:0xb7fc0360-->0x0
    ESI:0x0
    EDI:0x0
    EBP:0x9090
    ESP:0xbffff49c-->0xbffff450-->0xdb31c031
    EIP:0x80485dd(:ret)
    EFLAGS:0x292(进位奇偶校验调整零符号陷阱中断方向溢出)
    [---------------------------------------代码------------------------------------------]
    0x80485d0:mov DWORD PTR[esp],0x80487f4
    0x80485d7:调用0x80483f0
    0x80485dc:离开
    =>0x80485dd:ret
    0x80485de:推送ebp
    0x80485df:mov ebp,esp
    0x80485e1:推送ebx
    0x80485e2:子esp,0x64
    [-------------------------------------堆栈---------------------------------------------------]
    0000 | 0xbffff49c-->0xbffff450-->0xdb31c031
    0004 | 0xbffff4a0-->0x0
    0008 | 0xbffff4a4-->0xbffff564-->0xbffff6b2(“/root/Desktop/CSCE_526/task1”)
    0012 | 0xbffff4a8-->0x804876b(:添加ebx,0x1351)
    0016 | 0xbffff4ac-->0xb7fbeff4-->0x15ed7c
    0020 | 0xbffff4b0-->0x8048760(:推ebp)
    0024 | 0xbffff4b4-->0x0
    0028 | 0xbffff4b8-->0xbffff538-->0x0
    [------------------------------------------------------------------------------]
    gdb peda$n
    无法访问地址为0x9094的内存
    

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

    在我看来,调试器似乎在
    leave
    指令之后没有显示寄存器状态,但在它之前

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

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

    编辑:事实上,我现在认为访问冲突发生在
    leave
    指令中,并且
    ret
    从未执行过
    leave
    还尝试
    pop ebp
    ,我认为存在访问冲突


    在这里查看有关离开的一些信息:

    是的,我更改了我的有效负载,用合法地址而不是nops来填充EBP,并且它在GDB中工作。但是奇怪的行为是,如果我在GDB中不间断地运行它,它就会正常工作;如果我通过“/prog
    cat payload
    ”运行它,则它会出现seg故障。“/progperl shellGenerate.pl”也会出现同样的情况
    [----------------------------------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