python3-pwntools教程_CTF PWN工具篇1
0x00 引子
今年5月份参加红帽杯比赛,线下攻防赛,因为不懂PWN类题目,被吊打。很不爽,于是从6月初开始重新学习汇编,操作系统到7月底,算告一段落。参考书上教程,从零完成一个简陋的操作系统,只有一个进程。这个过程中最大的收获是对汇编的深入理解,以及程序加载执行的过程的熟悉。这对PWN来说是非常好的基础。现在开始学习PWN类题目。先来梳理下常用的工具。网上有人介绍过,我自己从初学者的角度来看待,尽可能详尽些。
后续会逐个详细介绍在做PWN题中使用到的功能点。
0x01 工具
古书云:人欲善其事,必先利其器。PWN类题目主要的工具有:pwntools:
这是基于Python开发的工具库。可以很方便的进行本地调试,远程利用。在github上可以找到。
gdb:调试神器
peda: 基于Python开发的gdb的插件,可以方便地显示当前栈,堆等信息。
IDA:反汇编逆向的神器,F5一键查看伪代码。
目前用到的就这么多,后面有的话,再添加。
0x02 pwntoolshttps://github.com/Gallopsled/pwntools,附上项目的github地址。这种正规的项目,都有完备的使用和开发说明文档,但这些文档太全面,从实用的角度来说,只挑现在用到的功能。
2.1 安装可以方便的使用pip进行安装:1pip install pwntools
2.2 pwntools使用的一般流程使用process/remote建立交互
通过调试,泄露堆栈信息找到利用点。
构造Payload利用
开启交互式shell,完成利用。
下面的介绍也是按照这样一个顺序进行。
2.3 process/remote模块PWN题一开始就要建立与可执行程序的交互。这就是通过这两个模块实现的。如果是本地调试的话,就使用process模块,本地调试好了就是远程利用拿FLAG了,用的是remote模块。
一般使用pwntools的脚本和可执行文件放在同一目录,方便管理。使用process的过程为:1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17# 引入模块
from pwn import process
# 生成实例
p = process('./pwn')
# 向进程发信息, 模拟用户的输入,在输入后添加回车,传递给进程。
p.sendline('some thing')
# 接收进程输出信息
# 交互时,要确定进程的状态,通过recvuntil,确保程序是运行在期望的状态下,
# 可以保证Payload是在合适的时机发送的。
p.recvuntil('some thing')
# 开启交互shell
# 这个时候要确认进程已已经成功get shell了,这个函数能开启一个shell。如果
# Payload 有异常这时脚本会异常中止。
p.interactive()
2.4 ELF模块
大多数CTF比赛中的PWN题是基于Linux下可执行文件的。而Linux下可执行文件的格式为ELF。有时候我们需要从可执行文件中提取出一些有用信息,如函数的相对偏移地址,函数在GOT,PLT表的位置等,包括libc中一个信息。
这里再说一下自己对程序和进程的差别的理解。
也就是说进程不是简单地把程序拷贝到内存就可以执行了。这当中有许多历史和技术原因。程序是编译好的可执行文件,存在于磁盘上的。它的内容是按段组织的。可以使用objdump -x pwn2来查看。可以看到文件分成好多段,粘过来的格式乱掉了。
一般基本的有:.text: 代码段
.data: 数据段
当然用C语言编写得到的可执行程序的段不会只有这2个。如果是汇编的话,就能做到只有这两个段。这里的.text段放的就是程序要执行的代码,是编译好的机器语言。.data段放的是变量,全局变量。因为局部变量是在栈上分配的。除了这两个,还一个header段,是用来说明这个程序的文件格式。
需要动态链接的程序还会有以下段:
.plt: procedure link table, 过程链接表
.got: global offset table,全局偏移表。
当然这两个段跟PWN题强相关的。这两个段用于在加载时,重定位库函数的偏移地址的。可参考这篇文章聊聊Linux动态链接中的PLT和GOT(1)——何谓PLT与GOT
通过ELF加载了可执行文件,就可以方便地读取一些信息了。1
2
3
4
5elf = ELF('./pwn')
# symbols里包含了变量,函数的地址。如果没有开启地址随机化的话,读到的地址,就是其实际加载的地址。
elf.symbols['system']
# 也可以读bss段的地址
elf.bss()
2.5 一些通用的模块
这些模块用来处理一些细节
如大小端字节的处理。这两个模块在由泄露信息生成payload时很好用,不需要再手动将32位数值转化为小端4字节二进制数,同时也方便将人可读的信息转化为机器可识别信息。1
2
3
4
5# 将32位数值转化为小当前计算机上的表示,x86就是小端得到的是/x78/x56/x34/x12
p32(0x12345678)
# 将32位地址转化为32位int
u32('x78x56x32x12')
python3-pwntools教程_CTF PWN工具篇1相关推荐
- Revit二次开发入门教程一(工具篇)
对BIM开发感兴趣的读者可以关注我的BIM开发系列教程 什么是BIM开发?这篇文章可以告诉你 Revit二次开发教程提纲 Revit二次开发编程入门一(工具篇) 前言 BIM诞生的背景 Revit在B ...
- PostGIS 3.1.2软件安装详细教程(地图工具篇.8)
听老人家说:多看美女会长寿 地图之家总目录(订阅之前建议先查看该博客) 官网下载地址 http://download.osgeo.org/postgis/windows/pg10/ Window64位 ...
- AcrGIS Desktop10.5软件安装详细教程(地图工具篇.1)
听老人家说:多看美女会长寿 地图之家总目录(建议先查看该内容) 注意:安装之前,关闭掉杀毒软件,安全卫士,防火墙 安装包下载: 链接:https://pan.baidu.com/s/1r09gP3jM ...
- Python3教程——3、Python3 用什么IDE开发工具好呢
和小名一起学Python Python3教程--Python3 用什么IDE开发工具 这也许是学习一门语言时大家都会问的一个问题,其实我个人认为无所谓哪个最好,关键在于哪个用着顺手,方便.还有很多人乐 ...
- iOS Hook相关教程 工具篇
iOS hook相关教程 工具篇 osx 工具集 class-dump 建议安装 class-dump,顾名思义,就是用来dump目标对象的class信息的工具.该工具利用Objective-C语言的 ...
- 【Android 教程系列第 27 篇】如何使用 Keytool 工具生成 keystore 签名文件
这是[Android 教程系列第 27 篇],如果觉得有用的话,欢迎关注专栏. 文章目录 一:Keytool 是什么? 二:Keytool 需要安装吗? 三:Keytool 密钥的存储形式 四:Key ...
- 【Unity3D 教程系列第 12 篇】如何用Unity写一个简易的计时器工具?
这是[Unity3D 教程系列第 12 篇],如果觉得有用的话,欢迎关注专栏. 平常关于延时的处理很多人都喜欢用携程去处理,但是在 Unity 里,并不建议大家用过多的携程,因为会出现一些莫名其妙的 ...
- 【Mac 教程系列第 3 篇】如何用 Mac 预览图工具修改图片的分辨率
这是[Mac 教程系列第 3 篇],如果觉得有用的话,欢迎关注专栏. 修改图片分辨率,可能你首先想到的是 PS ,其实 Mac 自带的预览图工具就可以修改,下面简单说下修改过程. 第一步 双击打开要修 ...
- 群辉服务器更新系统教程,男人的生产力工具 篇二百四十六:新手玩转群晖NAS:一步一步教你更新群晖DSM系统...
男人的生产力工具 篇二百四十六:新手玩转群晖NAS:一步一步教你更新群晖DSM系统 2020-08-05 10:46:03 18点赞 175收藏 59评论 新手与新知男人的生产力工具 篇二百三十九:新 ...
- 【HTML 教程系列第 1 篇】HTML 是什么?常用的开发工具有哪些?
这是[HTML 教程系列第 1 篇],如果觉得有用的话,欢迎关注专栏. 文章目录 一:HTML 是什么 二:HTML 要学习什么 三:HTML 文档的后缀名 四:HTML 的开发工具有哪些 一:HTM ...
最新文章
- Spring Boot 集成 JUnit5,更优雅单元测试!
- STP、RSTP和MSTP的比较
- scrapy windows
- VisualStudioCode 中设置中文语言【图文教程】
- devc++鼠标变成了光标_游戏鼠标到底能不能提升你的实力?
- Qt图形界面编程入门(1)
- 训练日志 2019.3.10
- 放大镜_医用手术放大镜
- 干货警告!国外有个小姐姐给29篇经典机器学习论文写了总结 | 资源
- Python-xlsx转置,行转列,列转行
- linux内核创建ubi,Linux最新UBI文件系统介绍
- 了解一下 Technorati 的后台数据库架构
- 集赞免费领《新程序员》电子刊!
- The reCAPTCHA was invalid. Go back and try it again.
- rk3288 linux烧录工具,Firefly-RK3288开发板烧写教程
- opencv读取透明图片
- 基于微信小程序的个人管理软件
- 华为OD机试题,用 Java 解【自动曝光】问题 | 含解题说明
- Anaconda安装详细教程
- opencv 播放mp4
热门文章
- (转)解决PowerDesigner 反向工程没有注释(备注)
- 寻找黑匣子——程序行为记录与跟踪
- 【SpringBoot_ANNOTATIONS】组件注册 02 @ComponentScan 自动扫描组件 指定扫描规则
- 简单的php商城,简单的php商城
- Android真机调试时LogCat不显示日志信息
- Maven工具的简单介绍,以及manen与spring框架之前的优缺点,解决什么是maven、为什么要使用maven,使用maven的好处等问题
- [转]跨域资源共享 CORS 详解
- 数据分析 第三篇:数据特征分析(分布分析+帕累托分析)
- 深入理解uwsgi和gunicorn网络模型
- flex与j2ee的结合(flex+Spring)