ELF64文件逆向分析知识—[0]搭建动态调试环境

之前一直学习Windows下的32位PE文件的逆向,已经可以通过Ollydbg和IDA结合分析可执行文件的逻辑。最近需要逆向分析一个Linux下的64位ELF可执行文件,发现了很多问题,下面是我分析和解决过程。

搭建动态调试环境

第一个问题摆在了我的面前,Ollydbg不能调试Linux的ELF可执行文件。Ollydbg提供了方便的调试界面,让我们很容易通过查看寄存器、栈和内存来分析程序的运行细节,这极大的增加了我们分析的效率。所以我在分析过程中都是使用动(使用Ollydbg进行动态调试)静(使用IDA进行静态分析)结合的方式逆向分析。

通过查找资料发现在Linux提供了一个可以进行汇编调试的强大工具—GDB。我尝试了用GDB进行动态调试,发现对于Linux新手来说这个过程真的很痛苦,当执行一条指令或一个函数前,需要记录我们要观察的内存位置(包括栈内存)和寄存器,执行后再次查看它们的变化,这个过程既麻烦又不直观,尤其是分析缓冲区溢出之类的问题。可能是自己对Linux操作系统的使用不熟悉的缘故,那还有其他办法么?

终于我找到了一个解决办法,使用IDA提供的远程调试功能。通常我们知道IDA提供的静态分析能力,其实IDA也提供了一个调试器,只是由于Ollydbg的存在,掩盖了它的风采(当我学习了IDA的调试器后发现这个调试器也有自己的独到之处)。好的,接下来就把我搭建调试环境的过程分享给大家。

安装Linux

我们可以通过Linux下的file和strings工具配合,来得到调试文件的信息,进而选择要安装的Linux。

先看下file工具的提示的信息: 


这里需要主要关注以下信息:

信息                      解释
ELF 64-bit           说明编译链接成可执行是在64位的Linux进行的。
x86-64                 说明了CPU的型号。
statically linked    说明程序采用的是静态链接
Stripped               说明最终的可执行文件去除了符号表和重定位信息,(使用 -s 选项)


再用strings工具查看更详细的操作系统信息:

我们只能谢天谢地,这个GCC信息没有在去除符号时被删除,根据上面的提示信息我们已经缩小了可执行文件使用的操作系统版本和GCC编译器的版本,这里我选择的安装CentOS-6.5-x86_64这个版本。

Note:精确选择Linux版本并不是调试所必须的,只要调试文件可以在Linux运行就可以,这里这么做是为了后面方便制作C静态标准库的签名文件。更详细请看后面的内容。


安装调试服务端程序

在IDA的安装目录/dbgsrv/找到linux_server或linux_serverx64这两个文件,具体选择哪个文件需要视待分析的ELF文件的编译信息而定,根据第一步中得出的信息,我需要选择的是linux_serverx64,把待分析的可执行文件和linux_serverx64一起拷贝到装好的Linux中。然后运行linux_serverx64: 


这样我们就在Linux中开启了远程调试端口,这个端口是默认的也不需要我们修改(其 
实这个过程和我们用VS远程调试VC++程序很类似)。

配置客户端调试选项

配置好调试的服务端后,接下来开始配置客户端IDA,正常启动IDA打开【Debugger】-【Run】-【Remote Linux debugger】来设置调试选项:

其中,填入信息如下:

选项                              应填入的信息
Application             带调试文件在Linux上的路径(包括带调试文件).
Directory                调试文件所在的文件夹路径.
Parameters            运行参数,例如运行可执行文件时传递到main函数的命令参数.
Hostname               Linux的IP地址.
Port                        Linux的端口,这里默认即可,和Linux上运行的linux_serverx64开启的端口一致.
Password               Linux登陆密码.


Note:上述设置,默认Linux是以root权限开启的,其他用户权限需要自己尝试设置。
设置好后,点击【OK】就启动了调试,看下调试界面: 


布局和Ollydbg基本上是一样的,我们很容易找到熟悉的四个窗口。

调试指令

介绍一下常用的调试指令:

调试指令                                           说明
单步步入(F7)                 执行下一条指令,若遇到函数,将进入函数代码内部,停在函数的第一条指令.
单步步过(F8)                 执行下一条指令,若遇到函数,仅执行函数自身,不进入函数内部.
终止(CTRL-F2)              终止一个正在运行的调试进程.
继续(F9)                        继续执行一个暂停的进程。执行将继续直到遇到一个断点、用户暂停或终止执行或该进程自行终止.
暂停( )                           暂停一个正在调试的进程.
运行至返回(CTRL-F7)    一直在函数代码内部运行,直到遇到RETN(或断点)时才停止.

断点

和Ollydbg一样,可以在选中的指令内存位置通过F2快捷键,设置软件断点。设置成功后,会以红色凸显(蓝色凸显的是将要执行的下一条指令)。可以通过【Debugger】-【Breakpoints】-【Breakpoint list】查看程序中当前已经设置的所有断点:

我们可以编辑我们设置的断点,在【Breakpoint list】中选中要编辑的断点,右键菜单选择【Edit…】即可打开编辑窗口: 


在这个窗口中我们看以看到,通过【Condition】栏可以为断点设置条件,这样断点就转化成“条件断点”。在【Settings】中勾选【Hardware】后软件断点转化成“硬件断点”,这是【Hardware breakpoint mode】选项将会被激活,来设置硬件断点必须指定行为。

更多的调试功能需要大家在调试过程中慢慢摸索。
--------------------- 
作者:杏林小轩 
来源:CSDN 
原文:https://blog.csdn.net/txx_683/article/details/53454139 
版权声明:本文为博主原创文章,转载请附上博文链接!

猜你喜欢

转载自blog.csdn.net/hnzwx888/article/details/85261824