[花指令、互补跳转][HZNUCTF 2023 final]虽然他送了我玫瑰花

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}

  • 7
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值