2024年江西省大学生信息安全技术大赛初赛re方向find的wp
1845017719556138 发表于 江西 CTF 350浏览 · 2024-10-10 07:54

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}

附件:
0 条评论
某人
表情
可输入 255
目录