pwnable 笔记 Toddler's Bottle - lotto
2016-11-21 10:56
453 查看
这题考察审计代码的能力……题目中的
首先生成一个了长度为6的由ASCII(1-45)组成的随机字符串
这个比较操作的本意是比较
但是这里用了两个
最后只要
这样就有
算了一下差不多有
虽说概率很大,但是手动地一次一次输入显得很low,于是写脚本解题,如下:
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
相关文章推荐
- pwnable 笔记 Toddler's Bottle - collision
- pwnable 笔记 Toddler's Bottle - mistake
- pwnable 笔记 Toddler's Bottle - input
- pwnable 笔记 Toddler's Bottle - cmd1
- pwnable 笔记 Toddler's Bottle - flag
- pwnable 笔记 Toddler's Bottle - fd
- pwnable 笔记 Toddler's Bottle - cmd2
- pwnable 笔记 Toddler's Bottle - blackjack
- pwnable 笔记 Toddler's Bottle - leg
- pwnable 笔记 Toddler's Bottle - random
- pwnable 笔记 Toddler's Bottle - shellshock
- pwnable 笔记 Toddler's Bottle - coin1
- pwnable 笔记 Toddler's Bottle - bof
- pwnable.kr [Toddler's Bottle] - lotto
- pwnable 笔记 Toddler's Bottle - passcode
- pwnable 笔记 Toddler's Bottle - uaf
- pwnable.kr [Toddler's Bottle] - input
- pwnable.kr [Toddler's Bottle] -fd
- pwnable.kr [Toddler's Bottle] - bof
- pwnable.kr [Toddler's Bottle] - passcode