exeinfope打开,为32位程序。
ida32打开后发现是MIPS指令集。
Ida7.5(ida7.0需要额外加插件)直接F5一键反编译。如下:
双击查看fdata,第一个strncmp是判断输入格式的,我们重点还是看sub_4007F0函数。
直接双击进入sub_4007F0(v5)函数,加密过程很容易就能看出是循环移位操作:
查看关键字符串Off_410D04如下:
接下来就可以写exp了,注意要防止移位过程中的溢出:
a=[0x52,0xfd,0x16,0xa4,0x89,0xbd,0x92,0x80,0x13,0x41,0x54,0xa0,0x8d,0x45,0x18,0x81,0xde,0xfc,0x95,0xf0,0x16,0x79,0x1a,0x15,0x5b,0x75,0x1f]
flag=''
for i in range(0,len(a)):
if i%2==0:
a[i]= (a[i]&0x3f) << 2 | (a[i]&0xc0) >> 6 #相当于循环左移2位(里面的与操作是为了防止溢出)
flag+=chr(a[i]^0x20 - i-5)
else:
a[i]=(a[i]&0xfc) >> 2 | (a[i]&0x3 ) << 6 #相当于循环右移2位(里面的与操作是为了防止溢出)
flag+=chr(a[i]^0x20 - i-5)
print('flag{'+flag)
得到flag