[FlareOn4]IgniteMe

无壳,32位

先进入ida,可以看到start函数,重要的就是4010F0()和if判断里的401050()

image-20240716085021969

先进入4010F0

image-20240716092403970

其中的一个函数,表示的是获取字符串长度(遇到null字符就返回i)

image-20240716092631373

后面就是将字符写入byte_403078这个数组

接下来看401050(),可以看到获取长度后,执行了一个401000,然后让数组从末尾开始和v4异或并存入目标数组,然后再让这一个字符和前一个字符异或,都存入目标数组,最后进行字符串相符判断。

image-20240716093155495

我们来看一下这个401000,直接看函数太看明白是什么,直接看汇编

image-20240716093447093

xor ax,dx就是将这个eax的值后16位都变成0

rol eax,4将eax的值循环左移4位

shr ax,1将ax算数右移一位(在二进制中这个操作就是除以2),保留符号

所以ax中的值变成了0000 0000 0000 0100 (4)

image-20240716104847586

image-20240716105002105

然后在循环时可以看到和eax(数组元素)异或的ecx里的值[ebp-1],就是al的值,就是0000 0100(4),所以v4就是4

然后就可以写EXP了

text = [0x0D, 0x26, 0x49, 0x45, 0x2A, 0x17, 0x78, 0x44, 0x2B, 0x6C, 0x5D, 0x5E, 0x45, 0x12, 0x2F, 0x17, 0x2B, 0x44,
        0x6F, 0x6E, 0x56, 0x9, 0x5F, 0x45, 0x47, 0x73, 0x26, 0xA, 0xD, 0x13, 0x17, 0x48, 0x42, 0x1, 0x40, 0x4D, 0xC,
        0x2, 0x69][::-1]
flag = ''
v4 = 0x4
for i in range(len(text)):
    flag += chr(text[i] ^ v4)
    v4 = ord(flag[i])
print('flag{'+flag[::-1]+'}')

得到结果flag{R_y0u_H0t_3n0ugH_t0_1gn1t3@flare-on.com}

posted @ 2024-07-16 10:33  yee-l  阅读(89)  评论(0)    收藏  举报