pwnable-coin1

本文详细解析了Pwnable网站上关于游戏逻辑漏洞的经典CTF题目coin1,涉及硬币鉴别与二分查找算法,通过远程连接ncpwnable.kr解决网络延迟问题,展示了实际的解题代码和获取flag的过程。
摘要由CSDN通过智能技术生成

概述

pwnable是一个经典的CTF中PWN方向练习的专业网站,本文记录的题目是coin1,主要考察的是游戏类代码逻辑漏洞的利用。

在这里插入图片描述

题目

题目描述

题目描述说明这是一个游戏,同时提示如果网络响应时间过长,可以本地连接

连接信息

nc pwnable.kr 9007

在这里插入图片描述在这里插入图片描述

根据题目帮助信息和游戏示例,这个游戏给你一堆硬币,其中有一个赝品。已知正品重量为10,赝品重量为9,如果能在60秒内,完成100次游戏则胜利。

单次游戏范例如Example所示,给出4枚硬币和2次机会,第一次称重第1枚和第2枚,得到重量20,第二次猜测第4枚得到重量10,则第三枚是赝品。

因此次数有限,由C决定,因为需要使用二分法查找。

根据题目提示,可以利用之前登陆pwnable靶机的凭证,在靶机本地进行nc连接,这样可以提高网络响应时间。

解题代码

from pwn import *

p = remote('localhost', 9007)

p.recvuntil('- Ready? starting in 3 sec... -')
p.recvline()
p.recvline()

for _ in range(100):
    line = p.recvline().decode('utf-8').strip().split(' ')
    n = int(line[0].split('=')[1])
    c = int(line[1].split('=')[1])

    start = 0
    end = n - 1

    for _ in range(c):
        mid = int((start + end)/2) 

        index_numbers = ' '.join(str(i) for i in range(start, mid + 1))
        p.sendline(index_numbers)
        weight = int(p.recvline())

        if weight % 10 == 0:
            start = mid + 1
        else:
            end = mid

    p.sendline(str(start))

    print(p.recvline())

print(p.recvline())
print(p.recvline())

p.close()

在pwnable.kr本地运行程序,得到flag

在这里插入图片描述
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值