赞
踩
1)基本信息收集
对于一个进程的分析,首先可以通过ps,lsof等命令了解程序的一些基本信息。这个阶段可以搜集进程开放了哪些端口,使用了哪些句柄,程序的运行状态。
2)获取程序组成二进制文件
下一阶段可以思考程序由哪些程序文件组成,通过ps命令可以找到程序的启动文件路径,通过进程的maps文件,可以查看进程加载了哪些so文件。 这一步可以得到程序的所有二进制代码,作为IDA与gdb的分析输入。
3)数据作为切入点,数据流跟踪
进程信息的搜集与程序代码分析都比较零散,无法很好的将各个部分连接起来。得到了二进制代码,逆向之后,也常常感觉到难以下手,缺少一个切入点。 此时数据流可以作为一条贯穿始终的线索,同时也可以作为对代码研究的切入点。
例如,当我们执行一个web登录请求时,首先可以用tcpdump抓取数据,分析apache与客户端之间的数据交互。 然后可以用strace监听apache与mysql, 分析这个数据流到达的过程中,apache与mysql利用哪些系统调用读写数据,用什么方式与其他进程进行通信。
使用gdb下断点,断下数据查看调用栈,分析处理数据的函数,即可在IDA中精确定位到相关逻辑处理的代码。这样即可通过一个可视化的操作作为切入点,对其每个阶段的数据流进行跟踪,最终精确定位到这个操作的逻辑处理代码,分析这个业务的逻辑。
分析思路如上图所示。
1)ps 命令收集进程运行信息
ps 可以找到进程的PID,状态,启用用户,进程启动命令等重要信息。
常用参数:
常用参数组合 afx,aux,alx
2)netstat 查看端口开放信息
Netstat 命令用于显示各种网络相关信息,如网络连接,路由表,接口状态等等。
常见参数:
参考资料:http://www.cnblogs.com/ggjucheng/archive/2012/01/08/2316661.html
3)lsof查看句柄信息
lsof(list open files)是一个列出当前系统打开文件的工具。在linux环境下,任何事物都以文件的形式存在,通过文件不仅仅可以访问常规数据,还可以访问网络连接和硬件。
常见参数
参考资料:每天一个linux命令(51):lsof命令 - peida - 博客园
4)cat /proc/{PID}/maps
每个进程的模块加载信息都会存到PID对应的maps文件中。通过这条命令可以打印进程的模块加载信息及加载到内存中的地址。
在整个分析过程中,数据流贯穿始终的线索。 数据本身才是核心的资产,同时数据也是验证一些猜想的最好证据。 如想要验证某个连接是否我的网络操作的连接,如果抓包该连接中出现了我提交的数据就可以证明这个连接与我的操作相关了。如gdb调试中在内存中打印出输入的数据,就能确定走到了相关的函数调用点。
进程与外界的数据交互,可能是与文件的交互,与其他进程的交互,或者与其他主机建立网络连接交互。在linux中这些都可以关联到句柄上,可以使用lsof查看。 但是有些交互发生在瞬间,很快就关闭了,没有合适的时机进行查看。 此时可以用strace 对进程进行监听,同时strace也可以通过一些系统调用分析程序的执行过程。
1)Strace 使用
常用参数:
参考资料:Linux strace命令 - ggjucheng - 博客园
用的比较顺手的组合strace –p 9126 –s 1024 –ff –o log
该命令会跟踪子进程和线程,并按线程将结果保存到不同的文件中。
使用strace最终apache得到的一些结果
该结果显示了一个网络连接建立,发送,接收,再到关闭的一个系统调用过程,能够帮助我们分析程序是如何执行的。
2)tcpdump使用
Tcpdump 是linux下常用的抓包工具,但是命令行下可视化分析不太方便。 推荐用-o选项将数据保存成pcapng格式的文件,再用wireshark或科来之类的软件对数据进行分析。
通过对进程信息的收集,我们能得到相关的启动程序与模块so文件,这时就能够丢到IDA中进行逆向分析了。 IDA的使用推荐阅读《IDA Pro权威指南》。再用gdb进行动态调试能够很好的帮助理解程序的运行过程,对数据的处理过程。在条件符合的情况下用gdbserver结合IDA的远程调试,或者使用BinNavi,能够更方便的分析程序流程。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。