这题考察审计代码的能力……题目中的for
使用有误,导致猜对随机字符中字符的概率增大,可以用脚本暴破解题。
题目源码
题目分析
题目的关键代码如下:
首先生成一个了长度为6的由ASCII(1-45)组成的随机字符串lotto
,然后用for
循环逐个字符的比较我们输入的字符串submit
与随机字符串lotto
,当有6个字符完全相同时,打印flag。
这个比较操作的本意是比较submit
与lotto
对应位置的6个字符,也就是说lotto
的第一个字符和submit
的第一个字符比较,lotto
的第二个字符和submit
的第二个字符比较……
但是这里用了两个for
循环,比较操作变成了submit
中的每一个字符分别与lotto
中的每一个字符作比较,如果相等,则match++
。也就是比较操作一共进行了6*6=36
次,变量match
的取值是0到36之间的一个数字。
最后只要match == 6
就可以得到flag
解题思路
为了让match
正好等于6,只需要用户输入六个相同字符即可
这样就有6*(1/44)
的概率让match == 6
算了一下差不多有14%
的概率猜对
虽说概率很大,但是手动地一次一次输入显得很low,于是写脚本解题,如下:
解题脚本
#!/usr/bin/python
from pwn import *
target = process("./lotto")
flag = 2
while flag:
s = target.readuntil("Exit\n")
if "bad" not in s:
print s
flag -= 1
target.sendline("1")
k = target.read()
target.sendline(chr(43)*6)
# run it in /tmp