题目来源:https://adworld.xctf.org.cn/task/answer?type=reverse&number=4&grade=1&id=5509&page=3
攻防世界crazy
这题进去之后发现要求输入32长度的字符串,然后会提示第几位有错误,就想到了可以穷举。
先给出代码:
from pwn import*
key="!#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~"
flag='tMx~qdstOs~crvtwb~aOba}qddtbrtcd'.ljust(32,'!')
while(True):
p = process("./crazy")
p.sendline(flag)
p.recvuntil("You did not pass ")
i=int(p.recv(2))
print(flag[0:i+1])
for x in range(len(key)):
if flag[i]==key[x]:
t=list(flag)
t[i]=key[x+1]
flag=''.join(t)
break
写的过程中遇到了很多问题,但最后还是搞了出来。
总体思路是枚举flag,每次枚举一位。代码中利用了pwntools:process()是创建一个进程;sendline()是发送并补充’\n’;recvuntil()是直到遇到什么为止;recv()是接受指定数目的字节。利用这些工具很轻松的就可以把框架写出来。
过程中遇到了一些问题。一个是每次运行时运行一会就停止了,附带一系列报错信息,我的解决方法是重定义flag的初始值,每次推进几位,然后多次重复。还有一个问题是一个小细节,接收错误位置i时应该写p.recv(2),而不是p,recv(1)。这个问题差点把我心态搞炸。
总体来说思路比较简单,当做暴力的练习还是十分不错的