题目概述



大概就是要我们写一个程序来和这个二进制程序交互,还要使用到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会更好

⬆︎TOP