概述
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