今天挑战一下,结果最后还是看了别人的wp才写出来的
无壳,ida查看发现不能f5,原因堆栈不平衡
进行栈指针修改
修改出错的地方的栈指针偏移,快捷键alt+k,值改为0
然后就能f5了,
逻辑也不难,首先输入长度是24位,然后有三个关键函数 wrong(),omg(),encrypt()
先看wrong和omg,wrong函数,对输入的前24个进行加密
omg函数比较wrong加密结果和unk_4030C0地址的值是否相同
把unk_4030C0地址的值考出来,写个脚本
s=[102, 107, 99, 100, 127, 97, 103, 100, 59, 86, 107, 97, 123, 38, 59, 80, 99, 95, 77, 90, 113, 12, 55, 102]
out=[]
for i in range(0,24):
if i&1 :
s[i]+=i
out.append(s[i])
else:
s[i]^=i
out.append(s[i])
for i in out:
print(chr(i),end='')
得到 flag{fak3_alw35_sp_me!!},但这是个假的flag,头疼
继续看第三函数:encrypt,由于这里encrpty的参数是v5,与之前的两个函数无关,所以这里的v5就是最初输入
但是这里encrpy不能反编译,直接点进这个函数也是一堆乱码:
好办,直接上od,在这个函数调用前的位置0x401833 下断点,然后执行到这:
f7步入,可以看到函数已经解密了
啊然后olldump直接脱壳,保存到新的exe
然后ida打开新的,找到这个函数
逻辑是,对输入的内容和hahahaha_do_you_find_me?这个字符串进行异或,然后和一个全局变量进行比较,注意只异或了19个字节,然后写出脚本还原一下
ans=[]
v2=[14, 13, 9, 6, 19, 5, 88, 86, 62, 6, 12, 60, 31, 87, 20, 107, 87, 89, 13]
str1='hahahaha_do_you_find_me?'
for i in range(0,19):
ans.append(ord(str1[i])^v2[i])
for i in ans:
print(chr(i),end='')
得到:flag{d07abccf8a410c
但是还差几位,继续看(由于是脱壳后的新程序,所以里的函数名有些不同)
最后有个函数,点进去
后面的判断就是无厘头,每次都是随机的,感觉这个函数有问题
但是flag的最后一位是“}”,这是固定的
盲猜v7应该是与某个数异或得到“}”
58 ^ ‘}’=71
2v3-v6应该逐位这个数异或,所以得到了后面几位:b37a}
完整拼接后得到flag{d07abccf8a410cb37a}
什么脑洞啊这是!