XCTF Reverse板块中的elrond32题目,个人解法
ExeinfoPE查看文件信息,32bit,那就用32位的IDA分析
进入Main函数:
猜测 if ( a1 > 1 && sub_8048414(a2[1], 0)) 条件满足,即输出flag函数 sub_8048538(a2[1]);
sub_8048538():
分析可得输出flag部分代码为(C):
1 | for (int i = 0; i <= 32; ++i ) { |
unk_8048760 (v2):
1 |
|
这里选中数据后Shift + E 发现有很多的0x00

使用LazyIDA提取数据,转换为DWORD (Double Word, 双字节, 占四BYTE,就可以把我们要的数据后边的0x00去除,避免出现一些问题) (选取数据,右键,Convert,Convert to C/C++ array (DWORD) )

1 | unsigned int unk_8048760[33] = { |
回到Main函数继续分析sub_8048414(a2[1], 0):
1 | int __cdecl sub_8048414(_BYTE *a1, int a2) |
看到是一个很长的控制流, **_BYTE a1, int a2* 就是带入的 a2[1], 0
当 a2 = 0 时,进入 case0,a1被赋值为105,进入LABEL_19,调用了sub_8048414 我们所在的函数,所以判断这就是一个递归
每次完成赋值goto到 LABEL_19 会对a2重新运算 7 * (a2 + 1) % 11 ,写一个脚本跑一下 (当然也可以手算)
1 |
|
编写解密脚本(C):
1 |
|
写的不好,有不对的地方请指出,谢谢 ><