运行程序,发现是要我们自己输入
那么肯定是拿到enc慢慢还原
32位,无壳
进来就红一下报错
这里可以看见长度为24
动调一下看看
这里进行了大量的异或
这里是对地址开始的硬编码进行异或,从而达到smc的效果
所以你也可以发现在进行这一步操作之前
encry函数全是报错
你点开数据段也发现这有很大一段数据
其实是因为没有异或前,是乱的
使用IDA以为是数据,保存在这
u和p一下就正常了
这是没有异或前的编译
a1就是我们输入的
然后buffer 和v1我们都知道
到这里就解出来了一部分
剩下那一部分就要靠脑洞了
你可以发现
buff是24位,说明buff还要用
我们已知最后一个是}
利用这个得到66
既然我们找不到其他数据
就用66带进去,异或
re就是要慢慢试
失败~
又想!
flag{fak3_alw35_sp_me!!}
这是前面得到的fake flag
能用吗?
直接粘贴上后面五位
还是G
好吧,现在整理下思路
已知!buff肯定要用!因为他的位数刚好24
我们围绕buff来
作者的语言也会给我们信息
为什么是come here
然后一个put函数?
f5什么也看不见
汇编呢?
汇编不是连着的吗
下面原本是一堆数据
你p一下
就出现五个数据!
试一下
塞在后面还是错了
__________
经过一系列猜测(看wp)
原来我先入为主认为buff一定ok了
op1=[0x0000000E, 0x0000000D, 0x00000009, 0x00000006, 0x00000013, 0x00000005, 0x00000058, 0x00000056,
0x0000003E, 0x00000006, 0x0000000C, 0x0000003C, 0x0000001F, 0x00000057, 0x00000014, 0x0000006B,
0x00000057, 0x00000059, 0x0000000D]
buuf='hahahaha_do_you_find_me?'
for i in range(len(op1)):
print(chr(op1[i]^ord(buuf[i])),end='')
op2=[37,116,112,38,58]# 71 ^ 58 = chr('}')
for i in op2:
print(chr(71^i),end='')
最后,至于其他wp那个改堆栈,其实对我没什么感觉,我就没写