checkhex题解
本帖最后由 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 =
{ 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){
printf("%x",j);
break;
}
}
}
}
}
10、输出一大串数字明显太长,直接16进制转text,转完一数刚好32位(da64e102c397573be5259706bcef0bc6),加上flag{},39位,输入试了一下还不对,但是应该离答案很近了
11、静态调试完还没得到flag,就上动态调试呗(这里可能也是因为我比较菜,等结束看看其他大神的wp)一路F8,都没问题,到如图这一步发现问题了,标黄这一行是关键的判断语句,对应静态分析里v9与checkbox那一条判断语句,可以看到如果相等就会跳转到地址004016A0进行下一次循环,看看此时寄存器里的内容(下方框框),可以看到里的数据和eax中的数据不相等,而且是相互交换位置的,尝试调换一下位置输入(原来为da64e102c397573be5259706bcef0bc6,改成ad461e203c7975b35e527960cbfeb06c,注意这里两两互换位置),输入一下,成功,flag{ad461e203c7975b35e527960cbfeb06c}
这道题最后为什么要调换位置我猜可能跟汇编里出入内存的顺序有关,对这块不是很熟,动态分析一步一步笨办法过来的,有大神可以解答下 XD_GEIGEI 发表于 2019-11-5 14:35
这道题最后为什么要调换位置我猜可能跟汇编里出入内存的顺序有关,对这块不是很熟,动态分析一步一步笨办法 ...
回味了一下,怎么感觉flag这么眼熟呢
checkbox就是flag,简单问题复杂化了。不过练了练许久不用的C语言也算不亏吧。
XD_GEIGEI 发表于 2019-11-5 14:35
这道题最后为什么要调换位置我猜可能跟汇编里出入内存的顺序有关,对这块不是很熟,动态分析一步一步笨办法 ...
有时候高级语言转换成汇编的时候会绕路~但是每个操作都有理论支撑的
页:
[1]