分享

分享一个有意思的gdb插件

 精品唯居 2021-04-24

最近在一个技术分享上听说了一个有意思的gdb插件:peta(https://github.com/longld/peda),使用它可方便地对C/C++代码进行逆向工程

效果图
peda的输出分为三个框,一个显示寄存器状态,一个显示当前汇编指令,一个显示stack状态

安装方法很简单,

git clone https://github.com/longld/peda.git ~/peda
echo "source ~/peda/peda.py" >> ~/.gdbinit
echo "DONE! debug your program with gdb and enjoy"

接下来写个小程序试用下:

#include <iostream>

int main() 
{
int i = 10;
i = i++;
std::cout << i << std::endl;
return 0;
}

执行i = i++之后,i的值是多少呢?是10还是11?根据语言标准这其实是未定义行为,也就是返回什么值,主要取决于具体的编译器实现。接下来我们在X86 GCC编译看看结果如何?

g++ -g -O0 1.cpp
./a.out
10

可以看到i的结果为10。为什么会这样呢?我们逆向二进制a.out一探究竟

gdb ./a.out

peda截图

核心代码如下,i从内存load到寄存器之后,先执行自增,然后先将自增结果11 save到内存,再将i++返回值10 save到内存,结果值11被10覆盖,最终i的值为10。

   0x00000000004007ea <+8>:  mov    DWORD PTR [rbp-0x4],0xa   ; i = 10
   0x00000000004007f1 <+15>:mov    eax,DWORD PTR [rbp-0x4]   ; eax = i(10)
=> 0x00000000004007f4 <+18>:lea    edx,[rax+0x1]             ; edx = 11
   0x00000000004007f7 <+21>:mov    DWORD PTR [rbp-0x4],edx   ; i = edx(11)
   0x00000000004007fa <+24>:mov    DWORD PTR [rbp-0x4],eax   ; i = eax(10)

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多