刚刚注册看雪,就来水一篇文章。
本来想发发我之前CTF的writeups,不过数量有点多,而且网上也有很多质量不错的wp,就发回之前写的pwntools新手教程。网上纯新手教程比较少,一般都是直接调用api,这篇主要是想给新手对pwntool一个更整体的认识。原文是我用英文写的,如果翻译的不好,请见谅。原文点此
下面开始正文:
pwntools是一个二进制利用框架。官方文档提供了详细的api规范。然而目前并没有一个很好的新手教程。因此我用了我过去的几篇writeup。由于本文只是用来介绍pwntools使用方法,我不会过于详细的讲解各种二进制漏洞攻击技术。
栈溢出无疑是二进制攻击的“Hello World”。这里,我们用pwnable.kr的bof来进行展示。
pwntools脚本:
源码简洁明了,我们只需要将key改写成0xcafebabe
。
现在我们重新看回pwntools脚本。第一行将pwntools提供的工具引入到我们的python上下文中。
remote("一个域名或者ip地址", 端口)
会连接到我们指定的地址及端口。 然后该函数会返回remote对象 (这里,我们将该对象保存到了变量 c
). remote对象主要用来进行对远程主机的输入输出. 它有如下几个方法:
在第三行中, p32()
可以让我们转换整数到小端序格式. p32
转换4字节. p64
和 p16
则分别转换 8 bit 和 2 bit 数字. c.sendline
将我们的payload发送到远程主机. "AAAA" * 14
是我们到key的偏移量. Pwntools 不能自动运算偏移量,用户需要自行计算。
最后,我们成功getshell了. 这时,你可能想发送命令进行交互. c.interactive()
允许我们在终端里将命令传送到远程服务器. Pwntools 会自动接收输出并回显 .
下一题是pwnable.kr的asm. 你需要用 ssh -p2222 asm@pwnable.kr
并输入密码 guest
来查看可执行文件和源码. 这里,我们只展示利用代码:
我们这里用到了新的api: process()
, contex.log_level
, gdb.attach
, 和 shellcraft
.
process
和 remote
累死. remote
连接远程主机, process
则通过你声明的二进制文件路径在本地创建新的进程. 除了 I/O, process
返回的对象可以通过 gdb.attach(p)
将进程attach到gdb上. Attach 之后, gdb 便可以调试该程序来 (设置 breakpoints, 查看 stack, 以及简单的反汇编).
提醒一下,如果你想在命令行中使用gdb.attach(), 便需要安装并运行 tmux. 更多关于tmux的信息.
当我们想查看服务器输出时,并不需要在每个 recvline
或者 recvuntil
前加 print
. 当 context.log_level
被设置为 "DEBUG"
, 我们的输入和服务器的输出会被直接输出.
shellcraft
是一个帮忙生成shellcode的类. 在我们的例子中, 我们 open 了一个文件并 read 文件到 stdout. 关于这个类更多的文档, 你可以查阅 官方文档.
我没有找到一个比较容易做的格式化漏洞题目,所以干脆用了官方文档的例子:
有了 FmtStr
, 我们不用算偏移量算到疯. 我们需要先构造一个可以接收我们输入并返回格式化字符串输出的函数. 接着,我们可以得到 autofmt
. 这个对象包含 offset
, 即算好的偏移量. fmtstr_payload(offset, {address: value})
帮我们生成最后的payload. 第一个参数 offset
用 autofmt.offset
算好的即可. 然后, 我们需要声明 {address: value}
来覆盖address的内容成对应的value. 我们还可以同时改写多个地址: {address1: value1, address2:value2,..., address: valueN}
.
有些情况不能自动生成payload. 以下文档介绍了如何手动生成payload fmtstr_payload.
有些题目给了我们libc. 用 gdb> x function1 — function2
算偏移量太麻烦了, 因此有了 ELF
.
和 process()
一样, 我们只用将路径给 ELF(path)
即可分析 ELF.
我们有以下几种方法操纵ELF:
Pwntools 是一套十分强大的工具. 在本文中, 我介绍了最常用的几个api, 但 pwntools 还有很多其他强大的api,诸如 qemu, adb. 各位可通过官方文档进行剩余的学习
文章就到这里了,第一次发贴orz,略略水,请各位大佬见谅。
我的blog: http://www.auxy.xyz会有略略高级的writeup,主攻pwn和web。博客为英文,不过还是希望大佬们捧捧场qaq。
[招生]科锐逆向工程师培训(2024年11月15日实地,远程教学同时开班, 第51期)
最后于 2019-1-30 13:20
被admin编辑
,原因: