Python pwn 工具使用案例(基于一次ctf挑战赛)

最近遇到一个ctf挑战题,Rock-Scissor-Paper, 石头剪刀布

具体内容就是1000次挑战程序,1000次全部获胜才能那道flag

Python pwn 工具使用案例(基于一次ctf挑战赛)_第1张图片这次挑战题的目的是了解计算机的伪随机数产生机制,在项目介绍pdf和程序运行一开始都会展示"It is not actually random "

虽然很快知道整个答案的顺序是不会改变的,每一次我都可以通过随意出拳来获得答案(如果对了就记录,如果错了也知道应该什么是对的,毕竟只有石头剪刀布)

面对这个问题,我第一次接触了python的pwntools(https://github.com/Gallopsled/pwntools-tutorial/blob/master/tubes.md)

**

pwn具体操作简介csdn上一大堆我就不陈述了

**

我遇到的问题是在

while True:
	io.process('./rock-scissor-paper')
	io.sendline('r')
	io.recvall()

在这里如果想要判断程序是否停止了,我们不能使用recvall()函数,如果源程序并没有停下recvall()得不到EOF就不会停止,会一直运行,这样就不会执行接下来的任何代码

后来我尝试过每次sendline之后叫停程序

while True:
	io.process('./rock-scissor-paper')
	io.sendline('r')
	io.close()
	io.recvall()

这个时候发现recvall()无论是直接打印还是转str打印,只能打印出来

b''

所以究竟应该如何判断程序时候终止了呢?
答:给recvall加上延时

while True:
	io.process('./rock-scissor-paper')
	io.sendline('r')
	if "You've" in str(io.recvrepeat(timeout = 1)):
	#这里因为只有在输掉之后有You've 所以我直接判断返回中是否存在You've
		...
	else:
		...

这样之后recvrepeat会直接得到1秒内返回的数据(这次是本地程序连接,如果是远程的最好弄大一点延时),不会继续等待EOF
然后就得到了我需要的“密码”

Python pwn 工具使用案例(基于一次ctf挑战赛)_第2张图片

顺利摘旗(flag是每个人唯一的,所以不加马赛克啦)

总结一下,第一次接触pwn,在判断程序是否自动结束的时候尝试过try获取EOF,但是后来发现这个EOF和python的报错的EOF是两回事。

以后会在尝试kali的时候再继续钻研pwn的~~

你可能感兴趣的:(信息安全)