《coredump问题原理探究》Linux x86版4.1节函数的逆向之序言

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/xuzhina/article/details/8557761

在产品的生命周期中,会遇到各种coredump,如果在调试版本出现coredump,定位它是非常简单的事情,因为从栈就可以知道是哪一行代码出现了问题。如:

(gdb) bt
#0  0x4365b569 in vfprintf () from /lib/libc.so.6
#1  0x436629ff in printf () from /lib/libc.so.6
#2  0x080485b9 in main (argc=3, argv=0xbfe21504) at xuzhina_dump_c4_s4.cpp:20

即使是main函数多次调用printf,从上面栈可以是第20行代码出了问题。

但,生活并不是这么容易。在产品生命周期中,发布版本的时间应该是最长,在发布版本的时间里出现的coredump或许不多,但都很难重现,也很难定位,且大多数是在客户环境上出现,解决它的优先级就非常高,影响也很大。但在发布版本出现的coredump,栈往往是这样的。

(gdb) bt
#0  0x4365b569 in vfprintf () from /lib/libc.so.6
#1  0x436629ff in printf () from /lib/libc.so.6
#2  0x080485b9 in main ()

如果main函数多次调用printf,究竟是哪个?如果手头上有对应的调试版本,可能会很好。但如果没有,怎么定位?难道只能一个个地试?每修改一个,就要开发人员修改,提供补丁,测试人员测试,一个来回可能就要几天时间。如果main函数调用10次printf,那么可能要花上一两个月的时间,这种研发成本是无法让人忍受的。虽然有些经验丰富的代码高手,会从代码审核中来猜出哪一行。就本人的工作经历所遇到的,也是不尽人意的,特别是非常难重现的场景。

再考虑一种情况,如果从客户环境返回来的并不是一个dump文件,只是把一些栈和寄存器的,那么又如何定位是哪一行代码出现问题?

由于C、C++代码的逻辑,即使编译成了可执行文件,它的逻辑仍然保留,完全可以在汇编里体现出来。也就是说,可执行文件的汇编和源代码是有对应关系。但由于源代码和汇编是一对多的关系,一行代码可以编译成几条甚至十几条指令,出现coredump的函数可能只有十几行代码,但对应的汇编指令却有几百行,怎么从coredump的指令来推断出出错的代码行?

每种编程语言都有几种结构:顺序结构,条件结构,循环结构。这些结构就构成了代码的骨架。汇编语言也不例外。如果能够把出错函数的汇编指令的骨架快速找出来,把这些骨架逆向成相关的结构语句,然后看coredump的指令位于骨架的哪一部分,就能够很快推断出出错的代码行了。

现在开始探究C,C++语言代码结构在汇编里对应的特征。

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏编程

Python教学——第七天

如果你前面都跟着文章做了,相信你已经自己在私下也了解了很多知识 如果你之前全都没有跟着做,也没有关系,至少你可以了解一个概念,对将来动手的时候会有一定的帮助 如...

25550
来自专栏博客园迁移

工作中的一些经验小结

控制层   返回值统一 AOP 也方便前台 AOP 统计执行时间记录日志   参数不要出现Request, Response   返回码定义 不...

7420
来自专栏蓝天

GCC 4.7相对4.6.x的改进点

原文:http://www.iteye.com/news/24628 针对C的功能改进: 支持ISO C11标准中的更多特性。除了之前的-std=c1x...

8730
来自专栏云计算教程系列

如何在Ubuntu 14.04上为IRC安装Lita Chat Bot

许多现代DevOps团队在聊天室周围建立了越来越多的基础设施。有很多聊天室,从商业选项(如HipChat和Slack)到DIY选项(如IRC或Jabber / ...

9510
来自专栏Zephery

谈谈个人网站的建立(四)—— 日志系统的建立

谈谈个人网站的建立(四)—— 日志系统的建立 欢迎访问我的网站http://www.wenzhihuai.com/ 。感谢,如果可以,希望能在GitHub上给个...

39440
来自专栏xiaoheike

es suggest did you mean资料

term suggester 根据提供的文档提供搜索关键词的建议,也就是关键词自动纠错。该链接介绍如何使用 term suggester 语法。term sug...

27530
来自专栏有趣的Python和你

Flask学习笔记之模板(三)

我们都知道html模板中,很多内容都是有重复的,譬如前面的head和后面的footer部分,这里的部分都是重复的,我们可以通过今天的学习的技术,减少代码的使用量...

8320
来自专栏程序员互动联盟

【专业技术】linux下如何打造一个最简单的Makefile

相信在linux下编程的没有不知道makefile的,刚开始学习unix平台 下的东西,了解了下makefile的制作,觉得有点东西可以记录下。   下...

36280
来自专栏FreeBuf

微信也被监控:HackingTeam语音监控代码分析

在HackingTeam泄漏的文件,我们发现了有针对主流聊天软件中的语音进行监控的代码,其中包括国内常用的微信。下面就以微信为例,来分析一下HackingTea...

32380
来自专栏Vamei实验室

Python标准库——走马观花

Python有一套很有用的标准库(standard library)。标准库会随着Python解释器,一起安装在你的电脑中的。它是Python的一个组成部分。这...

22060

扫码关注云+社区

领取腾讯云代金券