PWN-BabyCalculator
题目来源:2023MOECTF
题目概述
大概就是要我们写一个程序来和这个二进制程序交互,还要使用到pwntools这个工具。
安装pwntools
上网搜索了一下,pwntools是python的一个库,支持python3 使用pip安装:
apt-get update
apt-get install python3 python3-pip python3-dev git libssl-dev libffi-dev build-essential
python3 -m pip install --upgrade pip #升级pip,可以不执行
python3 -m pip install --upgrade pwntools #可能会升级pip,而且使用国外源,比较慢
python3 -m pip install pwntools -i https://pypi.tuna.tsinghua.edu.cn/simple/ #使用国内源,不更新pip,建议使用这条
使用pwntools
稍微了解了一下pwntools的用法,基本够用:
send(data) #发送数据
sendline(data) #发送一行数据,相当于在末尾加\n
recv(numb=4096, timeout=default) #给出接收字节数,timeout指定超时
recvuntil("hello,world\n", drop=False) #接收直到我们设置的标志出现
#(以下可以看作until的特例)
recvline(keepends=True) #接收到\n,keepends指定保留\n
recvall() #接收到EOF
recvrepeat(timeout=default) #接收到EOF或timeout
interactive() #与shell交互
编写POC
from pwn import * #引用库
r = remote("192.168.36.1","63551") #远程连接容器
i = 0
t = 0
times = 0
win = "BlackBird"
lose = "WingS"
context.log_level="debug" #显示pwntools的debug输出
while t < 7:
welcome = r.recvline() #逐行接受欢迎信息
t = t + 1
while times < 102:
i = 0
while i < 3:
line = r.recvline(keepends=False) #逐行检查接受信息,并去掉行尾的\n
mystr = line.decode("utf-8") #将接受到的byte类型字符转化为字符串
print(mystr)
if i == 2: #拆分给出的算式,判断答案,并将字符串转为byte并与容器交互
x = mystr.split("+")
a = int(x[0])
d = x[1]
e = d.split("=")
b = int(e[0])
c = int(e[1])
con = a + b
if con == c:
r.sendline(win.encode("utf-8"))
elif con != c:
r.sendline(lose.encode("utf-8"))
i = i + 1
#time.sleep(1)
times = times + 1
输入执行,得到flag
踩坑总结
1.pwn题目的byte要用decode转化为字符串才能用split处理
2.与容器交互时也要将输入字符转为byte(有一些教程不用,或许都要试试?)
3.接受数据时采用recvline是因为当时不清楚recvuntil的用法,用recvuntil会更好