攻防世界-reverse_re2

Writeup

IDA打开查看,在main函数使用F5反编译是有问题的,在汇编代码中,也能看到很多未反汇编的数据,显然代码做了混淆。

沿着main函数往下看到混淆部分代码,

1.在0x4116C8出使用call跳转到函数sub_4116CE,但sub_4116CE显然不是正常的函数结构。

2.函数sub_4116CE在最后push ebx后,retn即EIP会跳转到ebx中的地址。即sub_4116CE执行后会调转执行到0x4116E3+1的地址。

3.将0x4116E3+1出数据重新反汇编,sub_403E31是反调试检测,eax不为0.test eax,eax执行后ZF恒为1,jz指令必跳转到call sub_4116FD,后续执行又从步骤1开始重复。

 这里的混淆代码,可以简单粗暴的全部nop掉。主要的混淆代码有两段,st=0x2D16C8、ed=0x2D179F和st=0x2D1935、ed=0x2D1A18。即可写个简单IDA脚本,修改混淆代码

st=0x2D16C8
ed=0x2D179F
addr=st
while addr<=ed:
    patch_byte(addr,0x90)
    addr=addr+1

st=0x2D1935
ed=0x2D1A18
addr=st
while addr<=ed:
    patch_byte(addr,0x90)
    addr=addr+1

再重新构建main函数,反编译下已能大概看出执行流程

 这里应该是rc4加密,密钥为“12345678”。主要加密代码在sub_2C1C21和sub_2C2DEC中,,也可自行编写解密代码

Str2=[0xDD,0x9F,0x58,0xB3,0x72,0xC8,0xB1,0xD2,0x91,0x41,0x6F,0xBB,0xC9,0x5C,0x7B,0xC1,0x13,0xED,0xFB,0x28,0xB3,0x10,0xB,0xCF,0x21,0x68,0xA2,0x86,0x6B,0x9E,0x90,0x1D,0xCA,0xF4,9,0x1E,0xE8,0x79,0x6A]
s=[i for i in range(256)]
Key="12345678"
v6=0
v7=0
for j in range(256):
    v4=s[j]
    v7=(ord(Key[v6])+v4+v7)%256
    s[j]=s[v7]
    s[v7]=v4
    v6+=1
    if v6>7:
        v6=0
s1=""
v8=0
v7=0
for i in range(len(Str2)):
    v8+=1
    v5=s[v8]
    v7=(v5+v7)%256
    v4=s[v7]
    s[v8]=v4
    s[v7]=v5
    Str2[i]^=s[(v4+v5)%256]
    s1+=chr((Str2[i]))
print(s1)

不过这里我得到的flag是flag{youaretoasdasfazxvzxsw123sssssxxx},在攻防世界中提交错误,但在程序执行是通过的。官方wp中给的答案反而不行,很神秘。

 

posted @ 2024-01-22 23:56  写忧  阅读(240)  评论(0)    收藏  举报