您的位置:首页 > 编程语言

pwnable 笔记 Toddler's Bottle - lotto

2016-11-21 10:56 453 查看
这题考察审计代码的能力……题目中的
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
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  随机 pwn 代码审计