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

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

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

软件界面这次挑战题的目的是了解计算机的伪随机数产生机制,在项目介绍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
然后就得到了我需要的“密码”

rsp list

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

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

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

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值