目录
2.基本可以使用ubuntu系统简单命令,如(sudo,apt,ls,cd)
4.windows中下载反汇编神器——IDApro,并初次使用
四:栈的学习 (重要以星号数量为准)(每个题型根据自己的需求做1-3道题即可~)
零:写在前面
鉴于在我初学pwn的过程中的种种痛苦经历,立志写一个pwn学习指北,大家可以通过我个人建议的顺序和学习任务进行pwn方向的学习。
如果我的顺序和你心中想法有差异,以你为准~
ps:各位pwn师傅们有什么建议欢迎交流~~~
一:首先是pwn的初步介绍:
Pwn是一种在网络安全和黑客竞赛(如CTF,夺旗赛)中常见的技术类型。它主要涉及对程序漏洞的利用,以实现对目标系统的控制或获取敏感信息。以下是对Pwn的详细介绍:
Pwn的基本概念
定义:Pwn是一个俚语,来源于“own”,意为完全控制或拥有某个系统、程序或服务器。在网络安全领域,Pwn通常指通过发现并利用漏洞来接管目标系统。
应用场景:CTF比赛:Pwn是CTF中的一个重要类别,参赛者需要利用二进制漏洞(如缓冲区溢出、格式化字符串漏洞等)来获取目标系统的控制权。
漏洞挖掘与研究:用于分析软件的安全性,发现潜在的漏洞。
渗透测试:模拟攻击以评估系统安全性。
Pwn的关键
在ctf比赛中,关键就是拿到flag!!!
二:前置需要
1.学懂C语言!
C语言作为信息类的基础,重要性不言而喻
2.基本可以使用ubuntu系统简单命令,如(sudo,apt,ls,cd)
初步可以使用vmware虚拟机,在终端中自己尝试使用。
但后期学习中,强烈安利使用wsl,方便省力。
3.理解栈的生成
栈的生成和销毁
4.windows中下载反汇编神器——IDApro,并初次使用
不难,简单使用即可,在后面的学习中慢慢积累经验。
三:初步搭配ubuntu的pwn环境
个人推荐ubuntu24.04版本的系统进行搭配 (推荐先进行换源)
需要下载的东西如下:
1.python 我用的是3.12版本的,个人感觉没啥问题
2.pwntools 这个简单
3.gdb (ubuntu系统一般都会自带,可以在终端输入gdb检验一下!)
4.pwndbg
5.pwngdb
6.ROPgadget
7.checksec
初步学习的话linux下的环境就已经配置完成了
后续学习还需要:
1.LibcSearcher
2.seccomp-tools
3.onegadget
4.glibc-all-in-one
5.patchelf
安装完这些之后,栈部分基本够用了~
四:栈的学习 (重要以星号数量为准)(每个题型根据自己的需求做1-3道题即可~)
1.ret2text *
这道题称作pwn世界的helloword,一般都是有backdoor后门函数 (也许不叫这个名字,但一般有system("/bin/sh"))
这道题就是返回导向编程的第一步,通过简单栈溢出来修改返回地址,从而实现我们的目的
学习任务:
1.初步学会checksec
2.逐渐学会pwntools中的简单语句的功能
如: p64() ,p32() ,p=process('./文件'),p.recv() , p.sendline() . p.interactive()
3.明白栈帧中rbp和ret_addr两者的位置关系
4.明白两种情况
有的时候需要加个ret_addr整个字节对齐
有的时候就不需要加~
5.感受打通远程的快感
2.ret2shellcode *
这种题型还行,需要稍微熟悉一下shellcraft的用法
shellcode就是
学习任务:
1.开始初步了解几种程序的保护机制:canary、NX、PIE
2.第一次尝试使用shellcraft.sh()
3.canary **
主要考虑绕过canary对程序的保护,用一个输出相关的函数泄露出来就可以
但注意一点,绕过canary有较多方法,暂时不建议去学多种方法(如格式化字符串漏洞)因为我感觉在后面学会更好~~~
学习任务:
1.深刻了解canary这种保护机制
2.学习在python脚本接收来自程序中的数据
4.ret2libc ****
做题型需要提前了解一下什么是动态链接和静态链接
需要下载Libcsearcher,下载失败的话也不要紧,可以使用libc-database网站
学习任务:
0.学习pwndbg调试,慢慢学~
0.5. 学会ROPgadget
1.了解plt和got表有什么区别和联系
2.初步学习各个寄存器,以及x32和x64的传参的区别
3.初步学习打rop链
4.理解一下 libc_base_addr=函数真实地址 - libc的偏移地址
这个题型在栈这一章节中相当重要!它可以和好多题型进行结合(如csu、syscall)
坑!!!
在做有关libc的题目的时候,通常出现网上别人的exp在自己电脑打不通的情况,那就是libc和ld文件的问题了!!!
附加任务:
1.下载patchelf插件并学习如何使用
2.下载glibc all in one插件并学习如何使用
5.syscall ****
syscall和ret2libc的重要性平起平坐~,一般是在got表被人为抹去的时候用这种方法,难度较低~
学习任务:
1.了解linux系统的系统调用号
*学完syscall题型就可以开始配置WSL虚拟环境了!之后的所有环境插件全放到wsl里面就可以了!
6.one_gadget ***
one_gadget就是ret2libc的初步简化版本,主要思想就是libc文件中有一段可以实现execve("/bin/sh",NULL,NULL) (等同于system("/bin/sh")命令)的片段,被称为one_gadget
学习任务:
1.下载one_gadget插件 (可能踩雷,加油~)
2.熟练使用one_gadget来拿到shell~~~
7.ORW *****
我个人认为这道题实在是难以确定学习位置,它可以在学shellcode之后立马学,也可以现在才学。
这不是一种题型,更准确的说是一个知识点,这个知识点是可以和其他的题型结合着去出题的
所谓ORW就是O:open flag文件
R:read 文件内容到程序中
W:write程序中的文件内容到终端中
在没有进行system("/bin/sh")的前提下,我们也拿到了flag
学习任务:
1.下载seccomp-tools插件,了解沙盒保护
2.使用orw拿到flag
8.csu ****
来到了csu的学习终于也是上强度了~~~
学习任务:
0.思考如何控制rdx寄存器,ROPgadget找不到~
1.学习并了解csu
2.着重学习 call [r12+rbp*8] (这个是cus的一行指令,不一定是r12,有的时候是r15) 中的 [ ] 的作用
9.Srop **
srop可以比作立体几何中的建系,不过条件很苛刻,但一旦使用就是核武器、杀手锏!
学习任务:
1.了解即可,能用到的时候要会用~~~
10.栈迁移 ****
栈迁移是一种可以扩大payload长度的一种手段,可以和各种题型进行结合考察,考验pwn手对栈的布局的理解。
学习任务:
1.了解什么情况下使用栈迁移
2.深入理解leave ret指令的作用
五:格式化字符串 的学习
说实话这个板块可以在学习canary的时候就开始学,但我个人是不推荐的……因为我估计可能学不懂。所以我参考了一下ctfwiki上的学习顺序,把格式化字符串的学习放到了整个栈溢出的后面。
学习任务:
1.学习printf的漏洞的不同情况
2.学习用gdb查看所需要泄露的数据和栈顶的距离
六:堆的学习
0.学堆之前
需要先了解一下“数据结构”这门课程中的链表知识点,明白malloc函数的特性。
1.2.23版本的fastbin利用
①uaf
fastbin的uaf应该是最简单的堆题目了
学习任务
0.明白什么时候可以利用uaf
1.学会写堆题目的脚本的基本模板
2.学会利用heap,bins,vis等命令进行堆调试
3.明白chunk释放前和释放后各个位置代表什么含义
4.学会利用uaf去改指针,从而任意地址开chunk
5.学会利用free_hook和one_gadget拿shell
②堆溢出
堆溢出很重要,对于后续的unlink学习很关键
学习任务
1.利用堆溢出修改物理相邻的chunk的fd和bk指针
③double_free
double_free是fastbin很重要的特性之一,
在后续的tcachebin中需要分版本进行double_free(不常用)
学习任务
1.利用double free修改chunk的fd和bk指针
2.2.27版本的tcachebin的利用
tcachebin的管理机制和fastbin大不相同~
0.首先声明,tcachebin中依然可以使用uaf和堆溢出,但是double_free需要分版本进行 (好像只有2.27-3ubuntu1版本可以)
1.tcache投毒
学习任务
1.明白tcache的管理机制
2.学会利用其他漏洞进行tcache投毒,使tcache成为一种假满的状态,从而可以申请到unsortedbin中进一步得到libc有关的地址
未完待续(短期不会再更新)…………