*reverse*练习3——攻防世界-hackme
拿到题,查壳后用ida64打开。
老样子查找字符串,找到
点击进入,找到交叉函数F5反编译,
由下到上分析,如果要输出即v18不为0,即v13=v16^v12,v13可以查到数据,不是flag,v16是整型,也不会是flag,所以猜测v12是我们要求的flag,v12[i]=v13[i]^v16就可以求出v12。
这个函数是解题关键,但是我看不懂,
但与v6相关的都%22了,所以尝试一下遍历0-21个数字来写脚本跑一下。
以下是脚本代码
#include <iostream>
using namespace std;
int main()
{
char v12[22]={0};
int v6,v15,v11,v16;
//表示byte时,都用unsigned char
unsigned char v13[]= {0x5F,0xF2,0x5E,0x8B, 0x4E, 0x0E, 0xA3, 0xAA, 0xC7,0x93, 0x81, 0x3D,0x5F, 0x74,0xA3, 0x09,
0x91, 0x2B, 0x49, 0x28, 0x93, 0x67, 00,00
};
//截取了前22个
int i;
for(i=0; i<22; i++)
{
v11 = v6 % 22 + 1;
v15 = 0;
while ( v15 < v11 )
{
++v15;
v16 = (1828812941 * v16 + 12345);
}
v12[i]=v13[i]^v16;
}
for(i=0; i<22; i++)
{
cout<<char(v12[i]);
}
}
写脚本要注意,我用c++写的unsigned char与char的区别,还有数组初始化。
解出flag
flag{d826e6926098ef46}