本帖最后由 XD_GEIGEI 于 2019-11-5 14:33 编辑
这道题算是连蒙带猜吧,思路如下:
题目下载下来是个zip,解压出来
1、打开试试功能,发现就是一个flag验证程序,其中发现关键字符串“show me your flag:",随便输一个字符串进去,显示另一个关键字符串”wrong flag!"
2、打开IDA,静态分析,快速定位关键代码,shift+F12打开字符串试图,第两个就是上述关键字符串
3、双击进去,然后查看交叉函数ctrl+x
4、看到程序逻辑图,基本上就是经过几轮对比,与最后结果相同即为flag,,,F5大法反编译
5、分析之后,程序的逻辑也不复杂,第一部分说明需要输入一个39位的字符串,且该字符串必须是flag{}的形式
6、第二部分做了两个判断,(这里要说明一下SLOBYTE和SHIBYTE这两个函数,SLOBYTE意思是取低8位,SHIBYTE意思是取高8位)
看一下checkbox,双击点进去,然后shift+E导出数据
9、明白了逻辑可以写逆向程序了
#include <stdio.h>
#include <windows.h>
int char2hex(char a) //实现char2hex功能
{
if (a<=57 && a>47)
return a-48;
if (a>102 || a<=96)
return -1;
return a-87;
}
int main() {
int _checkbox[16] =
{ 173, 70, 30, 32, 60, 121, 117, 179, 94, 82, 121, 96, 203, 254, 176, 108 };
int i,j;
for(i=0;i<=15;i++){
for(j=0;j<=0xFFFFFFFF;j++){ //这里直接用爆破的思路,计算每一个可以符合条件的数
int a,b;
a = char2hex(LOBYTE(j));
b = char2hex(HIBYTE(j));
if(a != -1 && b!= -1){
int c;
c = 16*a+b;
if(c == _checkbox[i]){
printf("%x",j);
break;
}
}
}
}
}
10、输出一大串数字明显太长,直接16进制转text,转完一数刚好32位(da64e102c397573be5259706bcef0bc6),加上flag{},39位,输入试了一下还不对,但是应该离答案很近了
11、静态调试完还没得到flag,就上动态调试呗(这里可能也是因为我比较菜,等结束看看其他大神的wp)一路F8,都没问题,到如图这一步发现问题了,标黄这一行是关键的判断语句,对应静态分析里v9与checkbox那一条判断语句,可以看到如果相等就会跳转到地址004016A0进行下一次循环,看看此时寄存器里的内容(下方框框),可以看到[esp+3C]里的数据和eax中的数据不相等,而且是相互交换位置的,尝试调换一下位置输入(原来为da64e102c397573be5259706bcef0bc6,改成ad461e203c7975b35e527960cbfeb06c,注意这里两两互换位置),输入一下,成功,flag{ad461e203c7975b35e527960cbfeb06c}
|