以一道题来看一下逆向做题的常规步骤
(针对于初学者,比较简略,如有错误,敬请指正)
例题为BUU的刮开有奖,题目描述如下
第一步 查壳
拿到题目先看一下文件格式和有无壳,有壳则脱壳,无壳就可以根据文件格式直接静态分析了。
使用工具:DetectItEasy 或者 exeinfope
也可以在Linux下使用file命令可以看到是32位的PE文件,编译器和链接器这里能看出是什么语言编写编译的,如果有壳也会出现packer提示,指出是什么壳和壳的版本号。
第二步 查看题目文件
先看一下题目程序的内容和结构(在确定不是病毒文件的情况下,推荐在虚拟机里打开,尽量不要在物理机):
弹出一个图片,图片不能移动或修改
一般在这一步获取到题目是否输出字符串?是否有check?有无提示?如果是游戏题是否可以直接玩出来?有无出题人联系方式?(狗头)
比如:
第三步 静态分析
静态分析顾名思义就是看静态代码,分析逻辑
使用工具:IDA一把梭
根据之前查壳的时候的文件类型,64位就用IDA64打开,32位就用IDA32打开。
IDA的使用详情可见此文章
shift + F12 看一下字符串:
F5看一程序主体:
if ( a2 == 272 )
return 1;
if ( a2 != 273 )
return 0;
if ( (_WORD)a3 == 1001 )
{
memset(String, 0, 0xFFFFu);
GetDlgItemTextA(hDlg, 1000, String, 0xFFFF); //flag是我们输入的值,也就是String
if ( strlen(String) == 8 )//String为8位
{
v7[0] = 90;
v7[1] = 74;
v8 = 83;
v9 = 69;
v10 = 67;
v11 = 97;
v12 = 78;
v13 = 72;
v14 = 51;
v15 = 110;
v16 = 103;
sub_4010F0(v7, 0, 10);
memset(v18, 0, 0xFFFFu);
v18[0] = String[5];
v18[2] = String[7];
v18[1] = String[6];
v4 = (const char *)sub_401000(v18, strlen(v18))