2024年江西省大学生信息安全技术大赛初赛re方向find的wp
Find
查壳,32位Aspack壳
从看雪上面下一个脱壳器,脱完后放进ida里面。
发现VirtualProtect函数,大概率为smc加密。
大致逻辑看一下,就是先让我们输入一个字符串,长度为24,否则输出wrong,然后再进入sub_401050,sub_4010C0这两个函数,最后对sub_401150进行解密并调用。
跟进sub_401050。
发现对输入的字符串进行了一次加密。
跟进sub_4010C0函数。
对刚刚加密后的字符串进行了一次比对操作。
写出解密脚本:
int n[24] = { 102, 107, 99, 100, 127, 107, 103, 107, 124, 86, 122, 86, 126, 103, 60, 80, 100, 87, 77, 83, 123, 96, 100, 102 };
char m;
for (int i = 0; i <= 23; i++) {
if ((i & 1) != 0)
m = n[i]+i;
else
m = i ^ n[i];
n[i] = m;
printf("%c", n[i]);
}
解出了一个假flag----flag{part_part2_th_four}输入后程序提示do you find me?
对sub_401150进行解密,写出脚本:
for i in range(0x401150,0x401222):
patch_byte(i,get_wide_byte(i)^0x41)
重构函数后,进入sub_401150
一个简单的异或比对,解密脚本:
int vv[24] = { 0x68, 0x65, 0x6C, 0x6C, 0x6F, 0x68, 0x6F, 0x77, 0x61, 0x72,
0x65, 0x79, 0x6F, 0x75, 0x69, 0x61, 0x6D, 0x66, 0x69, 0x6E,
0x65, 0x74, 0x68, 0x69 };
int v[19] = { 14, 9, 13, 11, 20, 46, 87, 49, 37, 69, 85, 65, 44, 76, 91, 82, 85, 87, 94 };
for (int i = 0; i <= 18; i++) {
m = v[i] ^vv[i] ;
printf("%c", m);
}
得到flag前半段:flag{F8FD708C923817
进入最后一个函数sub_4011F0。
随机数爆破,爆破出来异或密钥为’G‘,解密(这里我是猜想的异或解密,看汇编也没看到有异或比对的操作,有大佬知道可以说一下吗?)不过为什么我随便输也是输出find last part?
char enc[6] = "wpq~:";
for (int i = 0; i < 5; i++) {
printf("%c", enc[i]^'G');
}
得到最后的片段0769}
拼接起来就是flag{F8FD708C9238170769}
附件:
- Find.zip 下载
0 条评论
可输入 255 字