攻防世界-XCTF 3rd-GCTF-2017 hackme

查壳

无壳

IDA

这个一开始点开每个函数看有点唬人,但是整体看下main函数结构挺简单的……ORZ

在循环内处理v19字符串,然后和flag的每个字符串异或得到v16字符串

在这里插入图片描述

解题

这里踩了一个坑,v17=sub_406D90 % 22 我看出来是有22种情况,但是没把他替换掉原本循环10次的do while,而是在do while(exp中改用while表示)前做了20次循环的嵌套。想看看每一种v17的结果。

以下输出的结果全是12390,因为v19变化后再次进入while循环,v19被清零,同时v16的值也没有变化:

byte=[
  0x5F, 0xF2, 0x5E, 0x8B, 0x4E, 0x0E, 0xA3, 0xAA, 0xC7, 0x93, 
  0x81, 0x3D, 0x5F, 0x74, 0xA3, 0x09, 0x91, 0x2B, 0x49, 0x28, 
  0x93, 0x67, 0x00, 0x00
]
flag=''
v20=10
for i in range(0,22):
    while(v20>0):
        v17=i
        v19=0
        v16=byte[i]
        # v15=flag[i]
        v14=i+1
        v18=0
        while(v18<v14):
            v18+=1
            v19=1828812941 * v19 + 12345
        flag=(v16^v19)&0xff
         v20-=1
        print(chr(flag),end='')

生成的值重复了20次,while(v20>0)毫无作用。遂删除while循环。

回过头来看,伪代码的do while也是有问题的,只循环10次,和上文明示的flag长度22不符:

在这里插入图片描述

因此直接用22次for循环替代原来10次while循环。

EXP

byte=[
  0x5F, 0xF2, 0x5E, 0x8B, 0x4E, 0x0E, 0xA3, 0xAA, 0xC7, 0x93, 
  0x81, 0x3D, 0x5F, 0x74, 0xA3, 0x09, 0x91, 0x2B, 0x49, 0x28, 
  0x93, 0x67, 0x00, 0x00
]
flag=''
v20=10
for i in range(0,22):
    # while(v20>0):
    v17=i
    v19=0
    v16=byte[i]
    # v15=flag[i]
    v14=i+1
    v18=0
    while(v18<v14):
        v18+=1
        v19=1828812941 * v19 + 12345
    flag=(v16^v19)&0xff
    # v20-=1
    print(chr(flag),end='')

flag

flag{d826e6926098ef46}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值