PWN的学习顺序推荐 | pwn学习指北

目录

零:写在前面

一:首先是pwn的初步介绍:

Pwn的基本概念

Pwn的关键

二:前置需要

1.学懂C语言!

2.基本可以使用ubuntu系统简单命令,如(sudo,apt,ls,cd)

3.理解栈的生成

4.windows中下载反汇编神器——IDApro,并初次使用

三:初步搭配ubuntu的pwn环境

四:栈的学习 (重要以星号数量为准)(每个题型根据自己的需求做1-3道题即可~)

1.ret2text  *

2.ret2shellcode *

3.canary **

4.ret2libc ****

5.syscall ****

6.one_gadget  ***

7.ORW  *****

8.csu ****

9.Srop **

10.栈迁移 ****

五:格式化字符串 的学习

六:堆的学习

0.学堆之前


零:写在前面

鉴于在我初学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有关的地址

                                             未完待续(短期不会再更新)…………

### 学习PWN汇编基础 #### 了解基本概念 在学习PWN相关的汇编基础知识之前,理解计算机体系结构中的几个重要部分至关重要。程序运行时会涉及到不同的内存段,其中包括代码段(text segment),这部分专门用于存储程序执行所需的机器令[^4]。 对于x86架构而言,掌握其特有的寄存器集合同样必不可少。这些寄存器被CPU用来保存临时数据以及控制流信息,在函数调用过程中扮演着极为重要的角色[^2]。 #### 掌握工具使用 为了更好地理解和调试汇编代码,熟悉一些常用的Linux命令行工具也是必要的: - `ldd` 命令可以显示动态链接库的信息; - `nm` 可以列出目标文件里的符号表条目; - `hexdump` 则能帮助查看二进制文件的内容并将其转换成易于阅读的形式[^3]。 #### 实践编写简单程序 下面是一个简单的C语言源码及其对应的汇编表示形式的例子,这有助于初学者建立起高级语言与底层实现之间的桥梁。 假设有一个非常简单的C程序如下所示: ```c // hello.c #include <stdio.h> int main() { printf("Hello, world!\n"); return 0; } ``` 通过GCC编译此文件,并加上 `-S` 参数来生成汇编代码: ```bash gcc -m32 -S hello.c -o hello.s ``` 得到的部分汇编代码可能看起来像这样(简化版): ```assembly .text .global _start _start: push ebp ; 设置新的栈帧基址针 mov ebp, esp ; sub esp, 0x10 ; 为局部变量预留空间 lea eax, [hello_str]; 加载字符串地址到EAX寄存器中 call puts ; 调用puts函数输出消息 xor eax, eax ; 清零EAX准备作为返回值 leave ; 恢复之前的栈状态 ret ; .data hello_str: .asciz "Hello, world!" ``` 这段汇编代码展示了如何设置函数框架、处理参数传递、调用外部APIs如`puts()`来进行I/O操作,最后清理现场并退出。 #### 关键知识点总结 - **寄存器**:深入了解各个通用目的寄存器的作用,特别是ESP/EIP/EBP等特殊用途的寄存器。 - **内存布局**:清楚认识进程内的不同内存区划分方式,尤其是`.text`, `.data`, 和堆栈区域的功能差异。 - **函数调用约定**:明白标准C/C++函数是如何构建和销毁它们自己的栈帧,包括参数压栈顺序及返回地址管理机制。 - **常用工具链**:熟练运用诸如GDB/GEF这样的调试辅助软件以及其他静态分析工具,以便更高效地逆向工程或漏洞挖掘工作。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值