Linux C++ 调试神技--如何将Linux C++ 可执行文件逆向工程到Intel格式汇编
Linux C++ 调试神技--如何将Linux C++ 可执行文件逆向工程到Intel格式汇编
对于许多在windows 上调试代码的人而言, Intel IA32格式的汇编代码可能并不陌生,因为种种的原因,很多软件工程师不得不去尝试理解汇编代码。Windows PE的反汇编格式默认是Intel格式的,但是由于历史的原因,在这个世界上还存在另外一种汇编,ATT格式,这也是Linux C++ 可执行代码的默认反汇编格式。
难道还真需要哥们学习两种格式的汇编么?一种学会了已经很NB了?
难道哥们在Windows上学的汇编到Linux上就白费了么?玩不转了么?
底层的处理器都是一个架构的,机器码都是一样的,这两种汇编代码一定可以互相转换,否则工具设计者智商一定低到写不出来工具。
对于这个问题且听兄弟以一个例子详细到道来。假设有如下的C++代码,我们将其在Linux上编译为一个名字为hellod的执行文件。
- #include<iostream>
- int main()
- {
- std::cout << "Enter two numbers:" << std::endl;
- int v1 = , v2 = ;
- std::cin >> v1 >> v2;
- std::cout << "The sum of " << v1 << " and " << v2
- << " is " << v1 + v2 << std::endl;
- return ;
- }
如果想看看现在的默认反汇编格式是什么,可以使用如下命令,可以看到Linux默认的是ATT格式的
- (gdb) show disassembly-flavor
- The disassembly flavor is "att".
反汇编结果如下:
- (gdb) disassemble main
- Dump of assembler code for function main():
- 0x000000000040092d <+>: push %rbp
- 0x000000000040092e <+>: mov %rsp,%rbp
- 0x0000000000400931 <+>: push %r13
- 0x0000000000400933 <+>: push %r12
- 0x0000000000400935 <+>: push %rbx
- 0x0000000000400936 <+>: sub $0x18,%rsp
- 0x000000000040093a <+>: mov $0x400ad4,%esi
- 0x000000000040093f <+>: mov $0x6011a0,%edi
- 0x0000000000400944 <+>: callq 0x400800 <_ZStlsISt11char_traitsIcEERSt13basic_ostreamIcT_ES5_PKc@plt>
- 0x0000000000400949 <+>: mov $0x400830,%esi
- 0x000000000040094e <+>: mov %rax,%rdi
- 0x0000000000400951 <+>: callq 0x400820 <_ZNSolsEPFRSoS_E@plt>
- 0x0000000000400956 <+>: movl $0x0,-0x28(%rbp)
- 0x000000000040095d <+>: movl $0x0,-0x24(%rbp)
- 0x0000000000400964 <+>: lea -0x28(%rbp),%rax
- 0x0000000000400968 <+>: mov %rax,%rsi
- 0x000000000040096b <+>: mov $0x601080,%edi
- 0x0000000000400970 <+>: callq 0x400810 <_ZNSirsERi@plt>
- 0x0000000000400975 <+>: lea -0x24(%rbp),%rdx
- 0x0000000000400979 <+>: mov %rdx,%rsi
- 0x000000000040097c <+>: mov %rax,%rdi
- ---Type <return> to continue, or q <return> to quit---
- 0x000000000040097f <+>: callq 0x400810 <_ZNSirsERi@plt>
- 0x0000000000400984 <+>: mov -0x28(%rbp),%edx
- 0x0000000000400987 <+>: mov -0x24(%rbp),%eax
- 0x000000000040098a <+>: lea (%rdx,%rax,),%r13d
- 0x000000000040098e <+>: mov -0x24(%rbp),%ebx
- 0x0000000000400991 <+>: mov -0x28(%rbp),%r12d
- 0x0000000000400995 <+>: mov $0x400ae7,%esi
- 0x000000000040099a <+>: mov $0x6011a0,%edi
- 0x000000000040099f <+>: callq 0x400800 <_ZStlsISt11char_traitsIcEERSt13basic_ostreamIcT_ES5_PKc@plt>
- 0x00000000004009a4 <+>: mov %r12d,%esi
- 0x00000000004009a7 <+>: mov %rax,%rdi
- 0x00000000004009aa <+>: callq 0x4007a0 <_ZNSolsEi@plt>
- 0x00000000004009af <+>: mov $0x400af3,%esi
- 0x00000000004009b4 <+>: mov %rax,%rdi
- 0x00000000004009b7 <+>: callq 0x400800 <_ZStlsISt11char_traitsIcEERSt13basic_ostreamIcT_ES5_PKc@plt>
- 0x00000000004009bc <+>: mov %ebx,%esi
- 0x00000000004009be <+>: mov %rax,%rdi
- 0x00000000004009c1 <+>: callq 0x4007a0 <_ZNSolsEi@plt>
- 0x00000000004009c6 <+>: mov $0x400af9,%esi
- 0x00000000004009cb <+>: mov %rax,%rdi
- 0x00000000004009ce <+>: callq 0x400800 <_ZStlsISt11char_traitsIcEERSt13---Type <return> to continue, or q <return> to quit---
- basic_ostreamIcT_ES5_PKc@plt>
- 0x00000000004009d3 <+>: mov %r13d,%esi
- 0x00000000004009d6 <+>: mov %rax,%rdi
- 0x00000000004009d9 <+>: callq 0x4007a0 <_ZNSolsEi@plt>
- 0x00000000004009de <+>: mov $0x400830,%esi
- 0x00000000004009e3 <+>: mov %rax,%rdi
- 0x00000000004009e6 <+>: callq 0x400820 <_ZNSolsEPFRSoS_E@plt>
- 0x00000000004009eb <+>: mov $0x0,%eax
- 0x00000000004009f0 <+>: add $0x18,%rsp
- 0x00000000004009f4 <+>: pop %rbx
- 0x00000000004009f5 <+>: pop %r12
- 0x00000000004009f7 <+>: pop %r13
- 0x00000000004009f9 <+>: pop %rbp
- 0x00000000004009fa <+>: retq
- End of assembler dump.
那如果我看不懂,我想使用Intel格式的汇编怎么办呢?下面的命令就可以做到,牛X吧?哈哈
- (gdb) set disassembly-flavor intel
- (gdb) show disassembly-flavor
- The disassembly flavor is "intel".
再来看看这下我们反出来的汇编代码, 已经变成Intel 格式的了
- (gdb) disassemble main
- Dump of assembler code for function main():
- 0x000000000040092d <+>: push rbp
- 0x000000000040092e <+>: mov rbp,rsp
- 0x0000000000400931 <+>: push r13
- 0x0000000000400933 <+>: push r12
- 0x0000000000400935 <+>: push rbx
- 0x0000000000400936 <+>: sub rsp,0x18
- 0x000000000040093a <+>: mov esi,0x400ad4
- 0x000000000040093f <+>: mov edi,0x6011a0
- 0x0000000000400944 <+>: call 0x400800 <_ZStlsISt11char_traitsIcEERSt13basic_ostreamIcT_ES5_PKc@plt>
- 0x0000000000400949 <+>: mov esi,0x400830
- 0x000000000040094e <+>: mov rdi,rax
- 0x0000000000400951 <+>: call 0x400820 <_ZNSolsEPFRSoS_E@plt>
- 0x0000000000400956 <+>: mov DWORD PTR [rbp-0x28],0x0
- 0x000000000040095d <+>: mov DWORD PTR [rbp-0x24],0x0
- 0x0000000000400964 <+>: lea rax,[rbp-0x28]
- 0x0000000000400968 <+>: mov rsi,rax
- 0x000000000040096b <+>: mov edi,0x601080
- 0x0000000000400970 <+>: call 0x400810 <_ZNSirsERi@plt>
- 0x0000000000400975 <+>: lea rdx,[rbp-0x24]
- 0x0000000000400979 <+>: mov rsi,rdx
- 0x000000000040097c <+>: mov rdi,rax
- ---Type <return> to continue, or q <return> to quit---
- 0x000000000040097f <+>: call 0x400810 <_ZNSirsERi@plt>
- 0x0000000000400984 <+>: mov edx,DWORD PTR [rbp-0x28]
- 0x0000000000400987 <+>: mov eax,DWORD PTR [rbp-0x24]
- 0x000000000040098a <+>: lea r13d,[rdx+rax*]
- 0x000000000040098e <+>: mov ebx,DWORD PTR [rbp-0x24]
- 0x0000000000400991 <+>: mov r12d,DWORD PTR [rbp-0x28]
- 0x0000000000400995 <+>: mov esi,0x400ae7
- 0x000000000040099a <+>: mov edi,0x6011a0
- 0x000000000040099f <+>: call 0x400800 <_ZStlsISt11char_traitsIcEERSt13basic_ostreamIcT_ES5_PKc@plt>
- 0x00000000004009a4 <+>: mov esi,r12d
- 0x00000000004009a7 <+>: mov rdi,rax
- 0x00000000004009aa <+>: call 0x4007a0 <_ZNSolsEi@plt>
- 0x00000000004009af <+>: mov esi,0x400af3
- 0x00000000004009b4 <+>: mov rdi,rax
- 0x00000000004009b7 <+>: call 0x400800 <_ZStlsISt11char_traitsIcEERSt13basic_ostreamIcT_ES5_PKc@plt>
- 0x00000000004009bc <+>: mov esi,ebx
- 0x00000000004009be <+>: mov rdi,rax
- 0x00000000004009c1 <+>: call 0x4007a0 <_ZNSolsEi@plt>
- 0x00000000004009c6 <+>: mov esi,0x400af9
- 0x00000000004009cb <+>: mov rdi,rax
- 0x00000000004009ce <+>: call 0x400800 <_ZStlsISt11char_traitsIcEERSt13---Type <return> to continue, or q <return> to quit---
- basic_ostreamIcT_ES5_PKc@plt>
- 0x00000000004009d3 <+>: mov esi,r13d
- 0x00000000004009d6 <+>: mov rdi,rax
- 0x00000000004009d9 <+>: call 0x4007a0 <_ZNSolsEi@plt>
- 0x00000000004009de <+>: mov esi,0x400830
- 0x00000000004009e3 <+>: mov rdi,rax
- 0x00000000004009e6 <+>: call 0x400820 <_ZNSolsEPFRSoS_E@plt>
- 0x00000000004009eb <+>: mov eax,0x0
- 0x00000000004009f0 <+>: add rsp,0x18
- 0x00000000004009f4 <+>: pop rbx
- 0x00000000004009f5 <+>: pop r12
- 0x00000000004009f7 <+>: pop r13
- 0x00000000004009f9 <+>: pop rbp
- 0x00000000004009fa <+>: ret
- End of assembler dump.
总结
对于很多计算机工程领域的技术问题,理解原理是最重要的,软件工程师很忙,忙着学东西,但是有的东西你一旦知道了道理,靠分析已经能节省很多的时间,根本不用去再学一遍,就拿本例来说,如果不去分析,再去学一遍另一个版本的,可能也是事倍功半,站的高方能望的远,和大家共勉。
Linux C++ 调试神技--如何将Linux C++ 可执行文件逆向工程到Intel格式汇编的更多相关文章
- Xcode7中你一定要知道的炸裂调试神技
转自:http://www.cocoachina.com/ios/20151020/13794.html Xcode7中苹果为我们增加了两个重要的debug相关功能.了解之后觉得非常实用,介绍给大家. ...
- Xcode7中你一定要知道的炸裂调试神技(转)
1.Address Sanitizer: 妈妈再也不用担心 EXC_BAD_ACCESS? EXC_BAD_ACCESS一直是很多开发者的噩梦,因为这个错误很不直观,出现后往往要花很长时间才能定位到错 ...
- Xcode7中你一定要知道的炸裂调试神技【转载】
Xcode7中苹果为我们增加了两个重要的debug相关功能.了解之后觉得非常实用,介绍给大家. 1.Address Sanitizer: 妈妈再也不用担心 EXC_BAD_ACCESS EXC_BAD ...
- linux内核调试指南
linux内核调试指南 一些前言 作者前言 知识从哪里来 为什么撰写本文档 为什么需要汇编级调试 ***第一部分:基础知识*** 总纲:内核世界的陷阱 源码阅读的陷阱 代码调试的陷阱 原理理解的陷阱 ...
- Linux Kernel - Debug Guide (Linux内核调试指南 )
http://blog.csdn.net/blizmax6/article/details/6747601 linux内核调试指南 一些前言 作者前言 知识从哪里来 为什么撰写本文档 为什么需要汇编级 ...
- 嵌入式Linux的调试技术
本节我们研究嵌入式Linux的调试技术,对于复杂的Linux驱动及HAL等程序库,需要使用各种方法对其进行调试.刚开始讲了打印内核调试信息:printk,这个函数的用法与printf函数类似,只不过p ...
- 第十章 嵌入式Linux的调试技术
对调试工具进行简介.Linux中提供了一类工具,通过这些工具可以逐行跟踪程序的代码,用于测试用户空间程序的gdb.gdbserver和调试内核空间程序的kgdb. 用gdb调试用户空间程序:gdb可跟 ...
- Linux GDB调试全面解析
GDB是GNU开源组织发布的一个强大的UNIX下的程序调试工具,GDB主要可帮助工程师完成下面4个方面的功能: 启动程序,可以按照工程师自定义的要求随心所欲的运行程序. 让被调试的程序在工程师指定的断 ...
- Linux内核调试方法总结【转】
转自:http://my.oschina.net/fgq611/blog/113249 内核开发比用户空间开发更难的一个因素就是内核调试艰难.内核错误往往会导致系统宕机,很难保留出错时的现场.调试内核 ...
随机推荐
- SELECT TOP 100 PERCENT 不按后面的order by 排序
项目中,由于需要把3个状态的任务合并显示,并且按照任务由近及远的顺序排序,类似于下面的语句 order by taskid desc )m union all order by taskid desc ...
- 在ASP.NET WebAPI 中使用缓存【Redis】
初步看了下CacheCow与OutputCache,感觉还是CacheOutput比较符合自己的要求,使用也很简单 PM>Install-Package Strathweb.CacheOutpu ...
- 设计模式之美:Observer(观察者)
索引 意图 结构 参与者 适用性 效果 相关模式 实现 实现方式(一):Observer 模式结构样式代码. 别名 Dependency Publish-Subscribe 意图 定义对象间的一种一对 ...
- 作业七:团队项目——Alpha版本冲刺阶段-11
部分功能实现: public void actionPerformed(ActionEvent ae) { //重新开始按钮 if (ae.getSource().equals(anew)){ int ...
- Wix 安装部署教程(八) 自动生成XML小工具
这个功能类似于Heat.exe,指定文件夹,生成对应的WIX标签.Winform做的,代码简单,生成的标签需要粘贴到对应的目录才能使用,并不是一步到位. 需要设定两个参数,一个是文件夹路径,一个是文件 ...
- 译文---C#堆VS栈(Part Four)
前言 在本系列的第一篇文章<C#堆栈对比(Part Three)>中,介绍了值类型和引用类型在Copy上的区别以及如何实现引用类型的克隆以及使用ICloneable接口等内容. 本文为文章 ...
- 项目开发之使用 maven
本文将详述 maven 在软件项目中的使用.首先讲述 maven 的基本工作原理及环境的搭建.然后讲述开发及配置管理人员如何使用 maven,最后将介绍 maven 与 eclipse 集成使用. m ...
- DISCUZ 自定义模板
DISCUZ 自定义模板 模板安装和维护 安装新模板 将模板template打包放在对应目录:template/ 后台 -> 界面 -> 风格管理 , 安装模板 后台 -> 界面 - ...
- http学习笔记(二)—— 嘿!伙计,你在哪?(URL)
我们之所以希望浏览网页,其中一个重要的原因就是庞大的web世界中有很丰富的资源,他就像哆啦a梦的口袋,随时都能拿出我们想要的宝贝.这些资源通过http被传送到我们的浏览器,并展示到我们的屏幕上.而我们 ...
- select2初始化默认值
之前用select2初始化默认值使用了select2('val','1'),这样做没问题,但只能用在单选上,多选的话,即使将val后面的值改成数组['0', '2']这种形式也没用. <scri ...