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相关推荐

  1. Revit二次开发入门教程一(工具篇)

    对BIM开发感兴趣的读者可以关注我的BIM开发系列教程 什么是BIM开发?这篇文章可以告诉你 Revit二次开发教程提纲 Revit二次开发编程入门一(工具篇) 前言 BIM诞生的背景 Revit在B ...

  2. PostGIS 3.1.2软件安装详细教程(地图工具篇.8)

    听老人家说:多看美女会长寿 地图之家总目录(订阅之前建议先查看该博客) 官网下载地址 http://download.osgeo.org/postgis/windows/pg10/ Window64位 ...

  3. AcrGIS Desktop10.5软件安装详细教程(地图工具篇.1)

    听老人家说:多看美女会长寿 地图之家总目录(建议先查看该内容) 注意:安装之前,关闭掉杀毒软件,安全卫士,防火墙 安装包下载: 链接:https://pan.baidu.com/s/1r09gP3jM ...

  4. Python3教程——3、Python3 用什么IDE开发工具好呢

    和小名一起学Python Python3教程--Python3 用什么IDE开发工具 这也许是学习一门语言时大家都会问的一个问题,其实我个人认为无所谓哪个最好,关键在于哪个用着顺手,方便.还有很多人乐 ...

  5. iOS Hook相关教程 工具篇

    iOS hook相关教程 工具篇 osx 工具集 class-dump 建议安装 class-dump,顾名思义,就是用来dump目标对象的class信息的工具.该工具利用Objective-C语言的 ...

  6. 【Android 教程系列第 27 篇】如何使用 Keytool 工具生成 keystore 签名文件

    这是[Android 教程系列第 27 篇],如果觉得有用的话,欢迎关注专栏. 文章目录 一:Keytool 是什么? 二:Keytool 需要安装吗? 三:Keytool 密钥的存储形式 四:Key ...

  7. 【Unity3D 教程系列第 12 篇】如何用Unity写一个简易的计时器工具?

    这是[Unity3D 教程系列第 12 篇],如果觉得有用的话,欢迎关注专栏. 平常关于延时的处理很多人都喜欢用携程去处理,但是在 Unity 里,并不建议大家用过多的携程,因为会出现一些莫名其妙的 ...

  8. 【Mac 教程系列第 3 篇】如何用 Mac 预览图工具修改图片的分辨率

    这是[Mac 教程系列第 3 篇],如果觉得有用的话,欢迎关注专栏. 修改图片分辨率,可能你首先想到的是 PS ,其实 Mac 自带的预览图工具就可以修改,下面简单说下修改过程. 第一步 双击打开要修 ...

  9. 群辉服务器更新系统教程,男人的生产力工具 篇二百四十六:新手玩转群晖NAS:一步一步教你更新群晖DSM系统...

    男人的生产力工具 篇二百四十六:新手玩转群晖NAS:一步一步教你更新群晖DSM系统 2020-08-05 10:46:03 18点赞 175收藏 59评论 新手与新知男人的生产力工具 篇二百三十九:新 ...

  10. 【HTML 教程系列第 1 篇】HTML 是什么?常用的开发工具有哪些?

    这是[HTML 教程系列第 1 篇],如果觉得有用的话,欢迎关注专栏. 文章目录 一:HTML 是什么 二:HTML 要学习什么 三:HTML 文档的后缀名 四:HTML 的开发工具有哪些 一:HTM ...

最新文章

  1. Spring Boot 集成 JUnit5,更优雅单元测试!
  2. STP、RSTP和MSTP的比较
  3. scrapy windows
  4. VisualStudioCode 中设置中文语言【图文教程】
  5. devc++鼠标变成了光标_游戏鼠标到底能不能提升你的实力?
  6. Qt图形界面编程入门(1)
  7. 训练日志 2019.3.10
  8. 放大镜_医用手术放大镜
  9. 干货警告!国外有个小姐姐给29篇经典机器学习论文写了总结 | 资源
  10. Python-xlsx转置,行转列,列转行
  11. linux内核创建ubi,Linux最新UBI文件系统介绍
  12. 了解一下 Technorati 的后台数据库架构
  13. 集赞免费领《新程序员》电子刊!
  14. The reCAPTCHA was invalid. Go back and try it again.
  15. rk3288 linux烧录工具,Firefly-RK3288开发板烧写教程
  16. opencv读取透明图片
  17. 基于微信小程序的个人管理软件
  18. 华为OD机试题,用 Java 解【自动曝光】问题 | 含解题说明
  19. Anaconda安装详细教程
  20. opencv 播放mp4

热门文章

  1. (转)解决PowerDesigner 反向工程没有注释(备注)
  2. 寻找黑匣子——程序行为记录与跟踪
  3. 【SpringBoot_ANNOTATIONS】组件注册 02 @ComponentScan 自动扫描组件 指定扫描规则
  4. 简单的php商城,简单的php商城
  5. Android真机调试时LogCat不显示日志信息
  6. Maven工具的简单介绍,以及manen与spring框架之前的优缺点,解决什么是maven、为什么要使用maven,使用maven的好处等问题
  7. [转]跨域资源共享 CORS 详解
  8. 数据分析 第三篇:数据特征分析(分布分析+帕累托分析)
  9. 深入理解uwsgi和gunicorn网络模型
  10. flex与j2ee的结合(flex+Spring)