首页 > 其他分享 >PwnTools使用技巧

PwnTools使用技巧

时间:2024-03-22 09:13:52浏览次数:153  
标签:函数 cyclic 可以 偏移量 字符串 模块 使用 PwnTools 技巧

PwnTools使用技巧

一. 通过上下文设置目标平台

二. 本地进程对象的创建

语法如下:

imageimage

通过声明的二进制文件路径可在本地创建新的进程并与其进行交互在上面创建的进程中,stdin默认使用的是管道。可以通过stdin=PTY来更改默认的设置,这样就能够以交互的方式进行操作。管道是一个单向的数据通道,数据只能从一端写入,从另一端读出。要实现双向的进程间交互,往往需要两个管道。stdout默认使用的是虚拟终端,这样共享库所提供的缓冲功能便失效。Linux进程的标准输入和输出如图3.4所示。

用这个可以实现本地的交互,查看本地是否可以实现相应功能。

三. 远程进程对象的创建

四. ELF模块

用户可以通过ELF模块获取程序基地址、函数地址(基于符号)、函数.got表地址、函数.plt表地址等。

常用的ELF模块API如下:

symbols['a_function']:用于获取函数a_function()的偏移地址。

got['a_function']:用于获取函数a_function()在.got表中的地址。

plt['a_function']:用于获取函数a_function()在.plt表中的地址。next(e.search(“some_characters”)):用于获取包含some_characters的字符串、汇编代码或者某个数值的地址。

image

五. search方法

image

六. cyclic命令的功能

cyclic命令的功能跟PEDA中的pattern_create和pattern_offset的功能类似,分别用于字符串的生成和子串偏移量的查找。执行cyclic命令的方式有两种,分别是命令行工具的方式和通过Python脚本文件调用函数的方式。

(1)字符串的生成

①通过命令行工具方式实现字符串的生成。使用pwn cyclic count命令或者cyclic count命令可以直接在shell命令提示符下生成字符串,例如:

image

②通过Python脚本文件调用函数cyclic(count)实现字符串的生成。例如:

image这样就可以直接生成字符串,不需要手动输入。

(2)子串偏移量的查找

①命令行工具方式实现子串偏移量的查找。使用pwn cyclic-l substr命令可以直接在shell命令提示符下查找子串偏移量,例如:[插图]第一个子串偏移量为0,若没有找到子串则返回-1。

image

②通过Python脚本文件调用函数cyclic_find(subpattern)实现子串偏移量的查找。例如,通过调用下面的函数可以查找subpattern在pattern中的偏移量。[插图]通过cyclic命令可以获取缓冲区溢出攻击中保存的返回地址(通过pop命令弹出到IP/PC)在缓冲区中对应的偏移量。例如,在栈溢出时,可以创建cyclic(0x100)或者更长的pattern并输入数据,若在输入数据后PC/EIP的值变成0x61616161,那么就可以通过cyclic_find(0x61616161)获知会从哪一个字节开始时控制PC/EIP寄存器,可以避免很多没必要的计算。

image

七. 数据转化

Pwntools可以依据上下文中的字节次序对数据进行打包和解包,实现字符串和整数之间的转换。对于整数的打包与解包,可以使用p32()、p64()、u32()、u64()等函数,分别对应着32位和64位的整数的打包与解包。通过p32()函数可以将整数类型转换为小端格式的字节类型,但存在的问题是在Python 2中与在Python 3中的格式是不一样的。在Python 3中,字节类型跟字符串类型不一样,是一个独立的类型;而在Python 2中,字符串类型和字节类型可以通用。

八. shellcraft模块

shellcraft模块是漏洞代码(shellcode)的生成器,主要的命令如下:

shellcraft-l:显示Pwntools自带的shellcode。

shellcraft-l|grep i386.linux.sh:显示Pwntools自带的32位系统的Shellcode。

shellcraft-f a i386.linux.sh:以汇编的格式显示Pwntools自带的32位系统的shell-code。

32位代码如下:

image

运行结果如下:

image

分为:指令,汇编代码,机器码三部分

与在32位系统中生成shellcode类似,在64位系统中需要将context.update(arch='i386',os='linux')改为context.update(arch='amd64',os='linux',bits=64)。

九. ROP模块

ROP模块的作用是自动寻找程序里的gadget,在进行ROP攻击时自动在栈上部署对应的参数。(在gadget要应用的时候再查找有关资料)

十. GDB模块

Pwntools中的GDB模块提供了一些可用于动态调试ELF文件的API,其中最常用的是attach()函数,在指定进程之后可以使用attach()函数来调试该进程,配合Proc模块就可以得到对应进程的PID。attach()函数需要开启一个新的终端,该终端的类型必须由环境变量或者上下文对象来指定。具体示例如下

image

上述代码首先通过proc.pidof(p)[0]取出进程的PID,然后使用attach()函数进行调试。context.terminal指定的是终端类型和参数,这里用的是gnome-terminal,运行后会自动打开一个新的gnome-terminal,在里面启动GDB模块并自动断下来,这样就可以调试了。另外,也可以在使用attach()函数时指定GDB脚本文件,这样可以在希望的地方停下来。在使用attach()函数时可不需要通过proc.pidof()来获取进程的PID,可以直接传入进程来调用attach()函数,同时也可以通过GDB脚本文件传入一个文件对象,如way 4所示。

(这种看看别人的EXP再慢慢学习一下即可,都是可以直接照搬的模板)

十一. 数据交互

(1)数据发送的常用函数如下:

send(payload):发送payload。

sendline(payload):发送payload,并进行换行(末尾加\n)。sendafter(some_string,payload):接收到some_string后,发送payload。

(2)数据接收的常用函数如下:

recv(numb=字节大小,timeout=default):接收指定字节数。

recvall():一直接收直到达到文件末尾(EOF)。

recvline(keepends=True):接收一行,keepends用于设置是否保留行尾的\n。

recvuntil(delims,drop=False):一直读到delims的pattern出现为止。

recvrepeat(timeout=default):持续接收直到文件末尾或timeout。

标签:函数,cyclic,可以,偏移量,字符串,模块,使用,PwnTools,技巧
From: https://www.cnblogs.com/ONEZJ/p/18088657/pwntools-use-tips-zkd5mx

相关文章

  • GDB使用技巧
    GDB使用技巧1.GDB启动直接调试目标程序:gdb./hello_server附加进程id:gdbattachpid调试core文件:gdbfilenamecorename2.退出GDB可以用命令:q(quit的缩写)或者Ctr+d退出GDB。如果GDBattach某个进程,退出GDB之前要用命令detach解除附加进程。3.常用命令命令......
  • soda-data dremio 集成使用
    以前简单介绍过soda数据质量工具,以下是关于dremio集成的一个说明环境准备dremiodremio基于docker部署,具体可以参考https://github.com/rongfengliang/dremio_cluster_docker-composesodasoda包含了library以及core,我使用了core,不依赖cloud,基于venvpython......
  • 关于使用向日葵等远程软件,关闭主机显示器后远程画面缩小的解决办法
    【方法一】修改分辨率直接在桌面上,右键【显示设置】>>>【显示器分辨率】>>>改成更大的分辨率即可。(当然这个方法的前提是:修改分辨率的选项是可选的而不是灰色的,并且你的鼠标可以下拉并点击到修改分辨率的选择框)【方法二】修改注册表1.打开主机和显示器,在桌面上右键>>>显示设置>>......
  • 使用概率分析与指示器随机变量解决生日悖论问题及C代码示例
    概率分析与指示器随机变量解决生日悖论问题一、引言二、生日悖论的概率分析三、指示器随机变量解决生日悖论问题四、C代码实现五、结论与启示一、引言在日常生活中,我们经常会遇到一些与概率相关的问题,其中生日悖论就是一个非常有趣且典型的例子。生日悖论指的是在一......
  • NOI2024前听课笔记2.0-《思维技巧选讲》by chenxia25
    NOI2024前听课笔记2.0-《思维技巧选讲》bychenxia25性质探索堆砌充分条件和必要条件luoguP10144[WC2024]水镜用形式化语言转化条件等价模型的刻画CF1458DFlipandReverseCF1510HHardOptimizationluoguP8293[省选联考2022]序列变换luoguP8416[THUPC2022决......
  • MySQL 索引:索引为什么使用 B+树?
    Hash索引不支持顺序和范围查询;二叉查找树(BST):解决了排序的问题,极端情况下可能会退化成线性链表,查询效率急剧下降;平衡二叉树(AVL):通过旋转解决了平衡的问题,但是旋转操作效率太低; AVL树是严格的平衡二叉树,所有节点的左右子树高度差不能超过1红黑树:通过舍弃严格的平......
  • 【ai技术】(3):树莓派4,成功安装ollama软件,内存4G,推荐使用命令行界面安装,使用raspi-config
    1,关于raspberrypi4项目https://www.bilibili.com/video/BV1K2421P71h/【ai技术】(3):树莓派4,成功安装ollama软件,内存4G,安装命令行版本,使用raspi-config配置wifi,速度9t/s2,下载raspberrypi镜像项目地址:https://www.raspberrypi.com/software/operating-systems/#r......
  • 程序“猿”的面试技巧与心法
    在数字化浪潮中,程序员这一职业已成为众人瞩目的焦点。面试作为进入心仪公司的关键环节,其实是一场精心策划的游戏。只要掌握关键策略与技巧,你定能在这场双向选择中脱颖而出。面试,本质上是一场自我推销的盛宴。不要将其视为考验临场反应的战场,而应视为展示个人魅力的舞台。你需......
  • Ubuntu使用gvm安装go
    建议使用非sudo用户装,方便vscode连接时go插件使用。1.若系统之前存在旧版本的go,无则跳过此步骤sudorm-rf/usr/local/gosudoapt-getremovegolangsudoapt-getremovegolang-gosudoapt-getautoremove2.到gvm的官方github页面找到安装的命令https://github.com/moo......
  • DA-CLIP关于使用BLIP生成数据集的代码注释
    背景:BLIP:DA-CLIP需要的目标: 为了在混合的退化数据集上训练DA-CLIP,作者使用引导式视觉语言框架BLIP为所有HQ图像生成描述。从HQ图像生成的描述是准确的,不传递退化信息。 然后,我们可以直接将这些干净的标题、LQ图像和相应的退化类型结合起来,构建图像-文本-退化类型......