BUU [WUSTCTF2020]funnyre

分析

首先查壳,无壳64位,放入IDA看看

发现找不到主函数,然后往下找,看能不能找到函数的入口

image-20220707155513056

发现都在没声明函数,然后去找结束点,一直往下找,发现不对

image-20220707155714465

这里的指令很多有错误,在cmp后有一个jnz进行跳转了,后面的jz和jnz明显多余要去掉,然后后面的call也有问题,也nop掉jz也nop掉,弄好之后我试了试发现不对,然后往下看,发现要一直nop到xor eax,eax为止。后面还有几个一样的错误都需要改,然后一直到

image-20220707160251727

按P进行声明函数,之后就可以F5了

image-20220707160415469

image-20220707161107537

最后就是比较unk_4025C0与(v5 + 5)是否一致,去看一下unk_4025C0

image-20220707161142206

不难看出,前面是先进行异或处理,后面是累加的处理,脚本就先累加再异或进行爆破查找得到flag,这里直接用官方脚本

脚本

dt = [0xd9, 0x2c, 0x27, 0xd6, 0xd8, 0x2a, 0xda, 0x2d, 0xd7, 0x2c, 0xdc, 0xe1, 0xdb, 0x2c, 0xd9, 0xdd, 0x27, 0x2d, 0x2a, 0xdc, 0xdb, 0x2c, 0xe1, 0x29, 0xda, 0xda, 0x2c, 0xda, 0x2a, 0xd9, 0x29, 0x2a]
def kaisa(xx, kk):
return [(x+kk) & 0xFF for x in xx]#&0xff取低8位
def xor(xx, kk):
return [x ^ kk for x in xx]
def check(xx):
for x in xx:
if x < ord('0') or (x > ord('9') and x < ord('a')) or x > ord('f'):
return False
return True
if __name__ == '__main__':
for k1 in range(0x100):
tt = kaisa(dt, k1)
for k2 in range(0x100):
tt2 = xor(tt, k2)
if check(tt2):
print(bytes(tt2))
print(k1, k2)
#flag{1dc20f6e3d497d15cef47d9a66d6f1af}