BUUCTF [ACTF新生赛2020]SoulLike
大开眼界!
main函数逻辑很清晰

只是最最关键的sub_83A

反编译不了
尝试阅读汇编代码
有一个很有意思的点:

这里有个printf("wrong on %d")
也就是根据我们输入的flag程序会告诉我们是否出错!
由于flag本体只有12位 所以可以利用pwn模块本地逐一爆破
思路就是从"actf{"开始枚举构造payload 正则提取 recv中的数字
如果数字与当前枚举位相同 就继续for循环 否则就到下一位置
exp:
from pwn import *
import re
context.log_level = 'debug'
# p = process('./pwn')
flag = "actf{"
pos = 0
while True:
for ch in range(32,128):
p = process('./pwn')
ch = chr(ch)
payload = flag + ch
print(flag)
# p.sendlineafter("input flag:",payload)
p.sendline(payload)
r = str(p.recvline())
num = re.findall("\d+",r)[0]
num = int(num)
# print(num)
if num == pos:
print('No')
elif num==pos+1:
print(r)
flag += ch
pos += 1
p.close()
p.close()
if pos>11:
break
print(flag)
Linux跑一跑就能得到flag了

actf{b0Nf|Re_LiT!}

浙公网安备 33010602011771号