Pwn入坑指南
1|0栈溢出原理
参考我之前发的一篇 Windows栈溢出原理
还有 brant 师傅的《0day安全笔记》
2|0解题过程
逆向和分析
这个过程就是IDA的使用和汇编代码的理解
IDA使用技巧:
getshell分两种情况:
(1) 内存程序中有getshell函数[system("/bin/sh")]或指令时,直接调用/劫持。
(2) 存程序中没有getshell函数或指令时, 就要编写shellcode。
3|0Pwn常用工具
gdb:Linux下程序调试
PEDA:针对gdb的python漏洞利用开发协助
pwndbg:和PEDA类似,GDB插件
pwntools:写exp和poc的利器(python库)
checksec:检查elf程序的安全性和程序的运行平台(一般来说peda里面自带的就够了)
objdump和readelf:可以很快的知道elf程序中的关键信息(Ubuntu自带)
ROPgadget:强大的Rop利用工具
one_gadget:可以快速的寻找libc中的调用exec('bin/sh')的位置
libc-database: 可以通过泄露的libc的某个函数地址查出远程系统是用的哪个libc版本
4|0检测elf安全性
拿到elf,首先用checksec检查elf运行平台,安全措施
如果用gcc的编译后,默认会开启所有的安全措施
1、RELRO:有Partial RELRO和FULL RELRO(开启),如果开启,则无法修改got表
2、Stack:如果栈中开启Canary found,就不能用直接用溢出的方法覆盖栈中返回地址
而且要通过改写指针与局部变量、leak canary、overwrite canary的方法来绕过
3、NX:NX enabled 如果这个保护开启就是意味着栈中数据没有执行权限
以前的经常用的call esp或者jmp esp的方法就不能使用,但是可以利用rop这种方法绕过
4、PIE:PIE enabled 如果程序开启这个地址随机化选项,就意味着程序每次运行的时候地址都会变化
而如果没有开PIE的话那么No PIE (0x400000),括号内的数据就是程序的基地址
5、FORTIFY:FORTIFY_SOURCE 机制对格式化字符串有两个限制
(1)包含%n的格式化字符串不能位于程序内存中的可写地址。
(2)当使用位置参数时,必须使用范围内的所有参数。
所以如果要使用%7$x,你必须同时使用1,2,3,4,5和6。
5|0泄露libc地址和版本的方法
[1] 利用格式化字符串漏洞 泄露栈中的数据,从而找到libc的某个函数地址
再利用libc-database来判断远程libc的版本,之后再计算出libc的基址,一般找__libc_start_main的地址
[2] 利用write这个函数,pwntools有个很好用的函数DynELF去利用这个函数计算出程序的各种地址
括函数的基地址,libc的基地址,libc中system的地址
[3] 利用printf函数,printf函数输出的时候遇到0x00时候会停止输出
如果输入的时候没有在最后的字节处填充0x00,那么输出的时候就可能泄露栈中的重要数据,比如libc的某个函数地址
6|0简单的栈溢出
程序没有开启任何保护:
方法一:传统的教材思路是把shellcode写入栈中,然后查找程序中或者libc中有没有call esp或者jmp esp,
比如这个题目: http://blog.csdn.net/niexinming/article/details/76893510
方法二:但是现代操作系统中libc中会开启地址随机化,所以先寻找程序中system的函数,再布局栈空间,
调用gets(.bss),最后调用system('/bin/sh')
比如这个题目:http://blog.csdn.net/niexinming/article/details/78796408
方法三:覆盖虚表方式利用栈溢出漏洞,这个方法是m4x师傅的方法,
比如这个题目:http://blog.csdn.net/niexinming/article/details/78144301
7|0开启nx的程序
开启nx之后栈和bss段就只有读写权限,没有执行权限了,所以就要用到rop这种方法拿到系统权限,如果程序很复杂,或者程序用的是静态编译的话,那么就可以使用ROPgadget这个工具很方便的直接生成rop利用链。有时候好多程序不能直接用ROPgadget这个工具直接找到利用链,所以就要手动分析程序来getshell了,比如这两个题目: http://blog.csdn.net/niexinming/article/details/78259866
8|0开启canary的程序
开启canary后就不能直接使用普通的溢出方法来覆盖栈中的函数返回地址了,要用一些巧妙的方法来绕过或者利canary本身的弱点来攻击 【1】利用canary泄露flag,这个方法很巧妙的运用了canary本身的弱点,当stack_check_fail时,会打印出正在运行中程序的名称,所以,我们只要将libc_argv[0]覆盖为flag的地址就能将flag打印出来,比如这个题目: http://blog.csdn.net/niexinming/article/details/78522682 【2】利用printf函数泄露一个子进程的Canary,再在另一个子进程栈中伪造Canary就可以绕过Canary的保护了,比如这个题目:http://blog.csdn.net/niexinming/article/details/78681846
9|0开启PIE的程序
(1) 利用printf函数尽量多打印一些栈中的数据,根据泄露的地址来计算程序基地址,libc基地址,system地址
比如这篇文章中echo2的wp: http://blog.csdn.net/niexinming/article/details/78512274
(2) 利用write泄露程序的关键信息,这样的话可以很方便的用DynELF这个函数了
比如这个文章中的rsbo2的题解:http://blog.csdn.net/niexinming/article/details/78620566
10|0全部保护开启
如果程序的栈可以被完全控制,那么程序的保护全打开也会被攻破
比如这个题目:http://blog.csdn.net/niexinming/article/details/78666941
11|0格式化字符串漏洞
格式化漏洞现在很难在成熟的软件中遇到,但是这个漏洞却很有趣 (1) pwntools有很不错的函数FmtStr和fmtstr_payload来自动计算格式化漏洞的利用点
并且自动生成payload
比如这个题目:http://blog.csdn.net/niexinming/article/details/78699413
和 http://blog.csdn.net/niexinming/article/details/78512274 中echo的题解
(2) 格式化漏洞也是信息泄露的好伴侣,比如这个题目中制造格式化字符串漏洞泄露各种数据
http://blog.csdn.net/niexinming/article/details/78768850
12|0uaf漏洞
如果把堆释放之后,没有把指针指针清0,还让指针保存下来,那么就会引发很多问题
比如这个题目 http://blog.csdn.net/niexinming/article/details/78598635
13|0任意位置写
如果程序可以在内存中的任意位置写的话,那么威力绝对很大 (1) 虽然只能写一个字节,但是依然可以控制程序的并getshell
比如这个题目 http://blog.csdn.net/niexinming/article/details/78542089
(1) 修改got表是个控制程序流程的好办法,很多题目只要能通过各种方法控制got的写入,就可以最终得到胜利
比如这个题目: http://blog.csdn.net/niexinming/article/details/78542089
(3) 如果能计算出libc的基地址的话,控制top_chunk指针也是解题的好方法
比如这个题目: http://blog.csdn.net/niexinming/article/details/78759363
14|0Pwn大佬博客
15|0学习资源
16|0Pwn思维导图
__EOF__

本文链接:https://www.cnblogs.com/wintrysec/p/10616856.html
关于博主:评论和私信会在第一时间回复。或者直接私信我。
版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!
声援博主:如果您觉得文章对您有帮助,可以点击文章右下角【推荐】一下。您的鼓励是博主的最大动力!
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· winform 绘制太阳,地球,月球 运作规律
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· AI与.NET技术实操系列(五):向量存储与相似性搜索在 .NET 中的实现
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 超详细:普通电脑也行Windows部署deepseek R1训练数据并当服务器共享给他人