前言
学习web安全也有2年了,最近想攻克一些CTF里面的逆向题目。所以开始着手学习逆向工程。在这里记录一下学习历程。对了我用的书是《有趣的二进制》,虚拟机是52Pojie专用虚拟机。
什么是静态分析
一句话简述就是:在不运行目标程序的情况下进行分析!
那么分析什么呢?分析程序的意图,在没有拿到编译后代码的前提下!
有哪些方法
1.阅读反汇编代码
Q:为什么是反汇编代码?汇编代码就不会读了吗?
A:因为逆向工程的目的是搞清楚程序的主要逻辑,如果能通过反汇编工具来读得话会轻松很多!告诉你个秘密不懂汇编代码也可以进行逆向!但是想走的更远,还是得懂一些基本的二进制代码。
2.提取可执行文件中的字符串,分析使用了哪些单词
因为一些反汇编代码中会出现一些常见的英文单词,比如:document,我们就知道这个可能与文件有关。或许直接给出了一个目录:C:/system/…,我们就知道这个程序和这个地址的有关系。
例如下图:我们通过二进制代码查看器(Winhex),也可以看出一些端倪!
有哪些好用的工具
1、Winhex
直接观察二进制代码。如上图。
2、IDA(静态分析的神奇)
关于IDA的页面做下说明:
IDA包含两种页面模式:Text View &Graph view
按F12可以通过Text View 进入 Graph View。
其实我们发现了,通过Graph view 可以很好的挖掘这段汇编代码的逻辑。<就是一个判断,满足条件走左边,否则走右边>。
第一次的逆向尝试(静态分析)
我们试一下在打开该exe文件,并且输入 2012,看看能否触发Hello 201。
为什么这么做呢?这就是我们上面进行静态分析的结果,从Graph View推测的结论。
可以发现:我们在输入
wsample01a.exe 2012
wasmple01a.exe 2013
wasmple01a.exe
结果为:
Hello 2012。后两种结果为Hello Windows。
我们下结论。根据传如的参数指可以左右这个程序的输出。
至此,我们完成了一次逆向工程。
因为我们在没有看源代码(C/C++)代码的前提下,搞懂了程序的意义。
这就是逆向工程!!!
该程序的C代码
#include <Windows.h>
#include <tchar.h>
int APIENTRY _tWinMain(
HINSTANCE hInstance,
HINSTANCE hPrevInstance,
LPTSTR lpCmdLine,
int nCmdShow)
{
if(lstrcmp(lpCmdLine, _T("2012")) == 0){
MessageBox(GetActiveWindow(),
_T("Hello! 2012"), _T("MESSAGE"), MB_OK);
}else{
MessageBox(GetActiveWindow(),
_T("Hello! Windows"), _T("MESSAGE"), MB_OK);
}
return 0;
}