f5之后发现,程序堆栈不平衡,不能直接反编译
options——general:
在0x401833这里改栈指针偏移,改成0,改成功之后就可以f5反编译了
可以看到主函数的逻辑还是比较简单的:
关键函数:wrong() omg() encrypt()
首先点进去wrong()函数,就是做一个加密,i 是偶数的时候进行异或操作,i 是奇数的时候进行减法操作
其次omg()函数,与所给字符串进行比较,这里直接上个小脚本:
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......flag{fak3_alw35_sp_me!!}
行吧,然后就再看看这个encrypt()函数,关键应该就在这里了,f5发现无法反编译
那就拖进od动态调试一下,在0x401833这里下个断点,执行到这里步入,然后ollydump一下程序形成新的exe
ida反编译一下新的exe,看下函数内部结构:
逻辑比较清晰,首先是把输入的内容和hahahaha_do_you_find_me?这个字符串进行异或19个字节,然后和v2全局变量进行比较,上脚本:
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
发现不全,找到主函数点进去看其他函数,找到sub_40159A()点进去查看:
这个v9是随机的,就觉得这个函数挺奇怪的,那这个就靠猜了....
因为flag最后一位肯定是" } ",是固定的,然后就写个异或脚本吧:
a = [0x25,0x74,0x70,0x26,0x3a]
b = ''
for i in a:
b += chr(i ^ 71)
print(b)
得到:b37a}
完整拼接后得到flag{d07abccf8a410cb37a}
总结:
整个程序其实逻辑上不算特别难懂;
自己看汇编的能力还是有点差的;
其实这题最开始可以选择不改堆栈指针,直接去看汇编确定函数结构
后面也可以选择不选择ollydump,步入看函数逻辑,改假的flag内存使得整个程序走到finally函数然后再继续调试
传送门
还翻到了其他大佬的博客,前面分析函数差不多,后面用了ida动态调试,可以仔细去看看
还是要再多练一练看汇编的能力呀....