[GXYCTF2019]luck_guy

[GXYCTF2019]luck_guy

拖入 ida 64,程序并不复杂,直接 F5 反编译就看到主要的流程

img

进入 patch_me() 函数

img

进入 get_flag() 函数

img

可以看到主要由一个 for 循环构成,循环里面是一个 switch 判断
(1)case1 用来输出变量 s,由 f1 和 f2 组成,s 应该就是我们需要的 flag,其中进入 f1 可以直接拿到值 GXY{do_not_,但是 f2 里面是空的
(2)case4 里面发现有一个变量 s,然后把 s 的值赋值给了 f2,其中 s 是 int 64 数据类型,存储时候实际按照小端序存储,需要逆转过来。直接查看变量 s 的值,发现没有规律,推测还需要进行进一步操作
(3)case5 里面对 f2 进行了处理,奇数位的字符进行 -2 操作,偶数位字符进行 -1 操作

因此可以猜测,需要先运行 case4 进行赋值,然后再到 case5 将 f2 进一步操作,最后运行 case1 输出

编写 python 脚本如下

f1 = 'GXY{do_not_'
f2 = '7F666F6067756369'
temp = 0
flag = f1
for i in range(len(f2)-2, 0, -2):
    print(int(f2[i:i+2], 16))
    if temp % 2 == 1:
        flag += chr(int(f2[i:i + 2], 16) - 2)
        temp += 1
    else:
        flag += chr(int(f2[i:i + 2], 16) - 1)
        temp += 1
print(flag)
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值