pwnable-coin1.md

文章目录

概述

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

pwnable-coin1.md

题目

题目描述

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

连接信息

nc pwnable.kr 9007

pwnable-coin1.mdpwnable-coin1.md

根据题目帮助信息和游戏示例,这个游戏给你一堆硬币,其中有一个赝品。已知正品重量为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

pwnable-coin1.md
pwnable-coin1.md

上一篇:spin_lock_irqsave关中断后,为什么要再禁止抢占


下一篇:AngularJS的日期格式化有两种形式