堆栈是指存储本地变量,返回地址等的位置。 esp和ebp指向的。

评论

github.com/eteran/edb-debugger/wiki/Stack-View

由mammon等各种作者寻找gdbinit,他们通常会解密并打印堆栈内容,或者只是使用x / x *(long *)esp,esp + 4编写脚本并在每个步骤上运行它,

#1 楼

您可以使用radare2中的可视面板轻松查看它。这是一个预告片:



安装

首先,从git仓库安装radare2:

$ git clone https://github.com/radare/radare2.git
$ cd radare2
$ ./sys/install.sh


调试

要使用radare2调试程序,请使用调试标志-d调用它:$ r2 -d /bin/ls

现在该程序在调试模式下打开。 />用v!显示可视面板模式。现在,您可以在左侧看到装配体,并在右侧看到堆叠面板。您可以相应地使用sS进行逐步调试。使用?在“可视面板”模式下列出更多命令。

其他一些显示堆栈的方法




pxa @ rsp-显示带注释的十六进制转储

pxw @ rsp-显示十六进制字转储(32位)

pxq @ rsp-显示十六进制四字转储(64位)

ad@r:SP-分析堆栈数据


要了解有关使用radare2进行调试的更多信息,建议阅读radare2书籍,尤其是“基本调试器会话”一章。

#2 楼

您可以使用gdb,例如,让我们看一下这个简单的程序

#include <stdio.h>

int main(){
  printf("hello world\n");
  return 0;
}


gcc -o simple simple.c -g


运行gdb

gdb ./simple


在主函数中设置一个断点并运行

(gdb) b main
(gdb) r


现在我们可以看看寄存器内容

(gdb) i r 
rax            0x400526 0x400526
rbx            0x0  0x0
rcx            0x0  0x0
rdx            0x7fffffffe518   0x7fffffffe518
rsi            0x7fffffffe508   0x7fffffffe508
rdi            0x1  0x1
rbp            0x7fffffffe420   0x7fffffffe420
rsp            0x7fffffffe420   0x7fffffffe420
r8             0x4005b0 0x4005b0
r9             0x7ffff7de78e0   0x7ffff7de78e0
r10            0x846    0x846
r11            0x7ffff7a2e740   0x7ffff7a2e740
r12            0x400430 0x400430
r13            0x7fffffffe500   0x7fffffffe500
r14            0x0  0x0
r15            0x0  0x0
rip            0x40052a 0x40052a <main+4>
eflags         0x246    [ PF ZF IF ]
cs             0x33 0x33
ss             0x2b 0x2b
ds             0x0  0x0
es             0x0  0x0
fs             0x0  0x0
gs             0x0  0x0


转储堆栈

    (gdb) x/20x $sp
    0x7fffffffe420: 0x00400540  0x00000000  0xf7a2e830  0x00007fff
    0x7fffffffe430: 0x00000000  0x00000000  0xffffe508  0x00007fff
    0x7fffffffe440: 0xf7ffcca0  0x00000001  0x00400526  0x00000000
    0x7fffffffe450: 0x00000000  0x00000000  0xbbbdddd1  0xdfdea768
    0x7fffffffe460: 0x00400430  0x00000000  0xffffe500  0x00007fff


显示说明

(gdb)  list
1   #include <stdio.h>
2   
3   int main(){
4     printf("hello world\n");
5     return 0;
6   }
7   
8   

(gdb) x/4i $pc
    => 0x40052a <main+4>:   mov    edi,0x4005c4
       0x40052f <main+9>:   call   0x400400 <puts@plt>
       0x400534 <main+14>:  mov    eax,0x0
       0x400539 <main+19>:  pop    rbp


等等...

#3 楼

请看一下它是否有用,并不断改进。这里是github主页上的一些注释:

完全不依赖操作系统,没有依赖项:GEF包含电池并且可以在2秒内安装(不同于PwnDBG)。
快速限制依赖关系的数量和优化代码以尽可能快地创建命令(与PwnDBG不同)。
提供了50多个命令来彻底改变GDB中的体验。
通过为GDB Python API提供更多易于理解的布局,可扩展以创建其他命令。
在Python2和Python3上均能始终如一地工作。在任何GDB支持的体系结构中,例如x86-32 / 64,ARMv5 / 6/7,
AARCH64,SPARC,MIPS,PowerPC等(与PEDA不同)
适用于实际应用调试,利用开发,就像CTF一样(与PEDA或PwnDBG不同)

安装
wget -q -O- https://github.com/hugsy/gef/raw/master/gef.sh | sh


评论


仅链接答案并不理想,请扩展您的答案以包括相关详细信息,例如提供的功能。

–多项式
17年7月31日在12:23