分享一个有意思的gdb插件
文章目录
更多精彩内容,请关注微信公众号:后端技术小屋
最近在一个技术分享上听说了一个有意思的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
核心代码如下,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)
推荐阅读 推荐阅读
- 一文读懂clickhouse集群监控
- 30分钟入门Vim
- 30分钟入门GDB
- STL源码分析–vector
- zookeeper client原理总结
- redis实现分布式锁
- 推荐几个好用的效率神器
- C/C++关键字之restrict
- 现代C++之右值语义
- Python乱码九问
- Linux Shell脚本攻略读书笔记
更多精彩内容,请扫码关注微信公众号:后端技术小屋。如果觉得文章对你有帮助的话,请多多分享、转发、在看。
文章作者 后端侠
上次更新 2021-03-07