*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}
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】博客园社区专享云产品让利特惠,阿里云新客6.5折上折
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步