1)、ida打开发现main函数无法正常反编译,观察发现互补跳转指令,导致ida无法正常反汇编。
2)、分析指令,导致花指令的原因是:在数据 02 74 01 前面加上了垃圾数据 75(jnz) 导致ida错误的将原指令反汇编成错误指令,
思考 : 为什么不是将后面的74作为垃圾数据呢?
原因 : 如果74是作者写入的垃圾数据,从而构成的花指令,那么与其一起受影响的指令应该位于其后方,但是本题互补的花指令位于其前方,所有垃圾数据不是74。
总结 : 发现互补跳转的花指令时,垃圾数据为前一个跳转指令的跳转字节(如 75(jnz))
3)、知道花指令的垃圾数据之后只需要将垃圾数据nop(字节改为90)掉即可反汇编。
修改后观察原本正确的函数:
就是因为在nop处的垃圾数据75,导致其与后面的02构成一个跳转指令,进而74 01构成了第二个跳转指令,而数据C7则被独立出来无法与其他数九构成指令,进而导致ida无法反汇编。
4)、修改完花指令后,重新定义函数即可正常反汇编。
根据main函数逻辑 和 内存数据编写解题脚本:
a=[
127, 126, 81, 206, 251,
78, 122, 36, 232, 223,
89, 113, 38, 202, 225,
108,134, 33, 204, 245,
40, 113, 20, 216,239,
110, 119, 98,250]
b=["F5CC2186","D8147128","62776EEF"]
print(0xFA)
for i in range(len(a)):
if i%5==0:
print(chr(a[i]^25),end="")
elif i%5==1:
print(chr(a[i]-18),end="")
elif i%5==2:
print(chr(a[i]+16),end="")
elif i%5==3:
print(chr((a[i]//2)),end="")
else:
print(chr(a[i]^128),end="")
flag{Wh4t_@_6eaut1fu1_$lower}