CTF-PWN比赛实用版
2024-07-21 14:46:01 1 举报
AI智能生成
"CTF-PWN比赛实用版是一个为网络安全爱好者和从业人员提供的实战平台。它涵盖了各种不同的挑战和任务,包括但不限于二进制审计、漏洞挖掘和利用、逆向工程、加密和解密等。这些挑战的难度各异,适合不同水平的选手参与。通过参与CTF-PWN比赛,参与者可以提高自己的技能和知识,同时也能了解到最新的网络安全趋势和攻防技术。"
作者其他创作
大纲/内容
1.PWN环境及工具
linux环境
操作系统Ubuntu
插件pwntools
cyclic
gdb(pwndbg)
ROPgadget
onegadget
libcSearch
objdump
反编译工具IDA Pro/Ghidra
2.解题思路
2.1下载pwn[可能含libc]
2.2将pwn上传linux环境下,使用file pwn查看
pwn 文件类型一般是ELF
pwn 是多少位文件 64位或者32位
pwn 是使用动态链接库还是静态链接库
动态库涉及GOT表-PLT表技术
PLT表
称为内部函数表,PLT表中的数据就是GOT表中的一个地址(指定好的),一定是一一对应的
PLT表中的每一项的数据内容都是对应的GOT表中一项的地址这个是固定不变的,到这里大家也知道了PLT表中的数据根本不是函数的真实地址,而是GOT表项的地址.而GOT表中的数据才是函数的最终地址。说到底PLT它有两个功能,要么在 .got.plt 节中拿到地址,并跳转。要么当 .got.plt 没有所需地址的时,触发「链接器」去找到所需地址
GOT表
GOT表存在于数据段里面。一般来说模块间的调用和跳转,GOT中相应的项保存的是目标函数的地址。在程序刚开始运行时,GOT 表项是空的,当符号第一次被调用时会动态解析符号的绝对地址然后转去执行,并将被解析符号的绝对地址记录在 GOT 中,第二次调用同一符号时,由于 GOT 中已经记录了其绝对地址,直接转去执行即可(不用重新解析)。ELF将GOT拆分成了两个表。.got和.got.plt
.got用来保存全局变量引用的地址
.got.plt用来保存函数引用的地址,它包含 PLT 表所需地址(已经找到的和需要去触发的)
.got.plt用来保存函数引用的地址,它包含 PLT 表所需地址(已经找到的和需要去触发的)
2.3在linux环境下,运行checksec pwn检查pwn文件的保护机制
Arch: amd64-64-little
说明程序的架构是x86架构-64位程序-小段字节序号
RELRO: Full RELRO
设置符号重定向表格为只读或在程序启动时就解析所有动态符号,从而减少对GOT表的攻击。RELRO为” Partial RELRO”,说明我们对GOT表具有写权限。如果开启FULL RELRO,意味着我们无法修改got表
Stack: Canary found
如果栈中开启Canary found,那么就不能用直接用溢出的方法覆盖栈中返回地址,而且要通过改写指针与局部变量、leak canary、overwrite canary的方法来绕过.(当启用栈保护后,函数开始执行的时候会先往栈里插入cookie信息,当函数真正返回的时候会验证cookie信息是否合法,如果不合法就停止程序运行。攻击者在覆盖返回地址的时候往往也会将cookie信息给覆盖掉,导致栈保护检查失败而阻止shellcode的执行。在Linux中我们将cookie信息称为canary。)
如果 Canary 已经被非法修改,此时程序流程会走到 __stack_chk_fail。__stack_chk_fail 也是位于 glibc 中的函数,默认情况下经过 ELF 的延迟绑定,
NX: NX enabled
enabled如果这个保护开启就是意味着栈中数据没有执行权限,以前的经常用的call esp或者jmp esp的方法就不能使用,但是可以利用rop这种方法绕过.如果在栈上执行shellcode,程序会尝试在数据页面上执行指令,此时CPU就会抛出异常,而不是去执行恶意指令。
PIE: PIE enabled
PIE enabled如果程序开启这个地址随机化选项就意味着程序每次运行的时候地址都会变化,而如果没有开PIE的话那么No PIE (0x400000),括号内的数据就是程序的基地址.
0 - 表示关闭进程地址空间随机化。
1 - 表示将mmap的基址,stack和vdso页面随机化。
2 - 表示在1的基础上增加栈(heap)的随机化。
1 - 表示将mmap的基址,stack和vdso页面随机化。
2 - 表示在1的基础上增加栈(heap)的随机化。
ASLR只能对堆、栈和mmap随机化(对mmap不太清楚),而不能对如代码段,数据段随机化,使用PIE+ASLR则可以对代码段和数据段随机化。
2.4在windowns下使用IDA_Pro工具进行静态分析
2.4.1 将pwn 拖入IDA_Pro对应的32或64位.exe文件
2.4.2 IDA_Pro左侧定位main函数,使用F5进行反编译后伪代码展示,分析代码漏洞
针对每个函数进行代码审计
缓冲区溢出:程序未正确检查用户输入的数据长度,导致超出预期的缓冲区范围,可能覆盖其他内存区域,如返回地址
栈溢出(ROP)虽然缓冲区溢出是栈溢出的一种形式,但更广泛地讲,栈溢出可能包括函数参数、局部变量等栈帧元素的不当处理。
堆溢出:发生在堆内存分配和使用过程中,由于不当的边界检查或数据验证,导致数据写入超出分配的内存范围。
格式化字符串漏洞:程序在处理格式化字符串时没有正确检查用户提供的格式字符串,可能导致泄露内存或执行任意代码。
Use-After-Free:程序在释放内存后仍然访问该内存,这可能导致任意写入或执行。
Double Free:同一块内存被释放两次,这可能导致程序崩溃或任意写入
整数溢出:当整数变量超出其表示范围时,可能导致计算错误,从而影响程序行为。
ASLR、NX页和Canary值:现代系统通常有各种安全机制,如地址空间布局随机化(ASLR)、非执行堆(NX)和Canary值来防止直接利用。
空指针解引用:程序试图访问或操作一个未初始化或已释放的指针指向的内存
环境变量注入:程序依赖于不可信的环境变量,这可能被恶意修改
文件描述符重定向:程序错误地处理文件描述符,可能导致文件内容泄露或任意文件写入。
权限提升:程序在运行时具有更高的权限,但由于错误的权限检查或资源管理,允许普通用户提升权限。
竞争条件:多个线程或进程间因同步不当,导致数据不一致或执行顺序错误。
信息泄露:程序意外地泄露敏感信息,如内存地址、密码、密钥等
格式化字符串缺陷的变种:除了传统的%n和%x等格式化标识符,一些程序可能使用非标准或自定义的格式化字符串处理,导致额外的安全风险
字符串操作错误:程序在使用strncpy、strncat等字符串操作函数时未正确设置长度参数,导致溢出或数据损坏。
信号处理:程序错误地处理信号,如SIGSEGV或SIGINT,可能导致未预期的行为或泄露敏感信息。
路径遍历:程序未正确验证文件路径,允许用户读取或写入系统中的任意文件。
资源管理不当:程序未能正确管理资源,如文件描述符、网络连接或内存,导致资源耗尽或状态混乱。
动态链接库(DLL)注入:程序加载恶意的动态链接库,这可能发生在环境变量、库搜索路径配置不当的情况下。
查找字符串【通过shift+F12】system和/bin/sh
都存在情况
仅存在system时
仅存在/bin/sh时
都不存在时
2.5在linux下使用gdb工具对pwn文件进行动态分析
缓冲区溢出:程序未正确检查用户输入的数据长度,导致超出预期的缓冲区范围,可能覆盖其他内存区域,如返回地址
栈溢出(ROP)虽然缓冲区溢出是栈溢出的一种形式,但更广泛地讲,栈溢出可能包括函数参数、局部变量等栈帧元素的不当处理。
利用方式:与缓冲区溢出相似,但可能需要更精细的控制来覆盖函数返回地址。
堆溢出:发生在堆内存分配和使用过程中,由于不当的边界检查或数据验证,导致数据写入超出分配的内存范围。
•利用方式:通过控制堆块布局,可以覆盖堆块元数据(如大小字段),或者覆盖紧邻的数据,从而实现任意读写。
•解决策略: •使用诸如pwntools或ROPgadget的工具来寻找合适的ROP gadgets。•利用cyclic工具找到覆盖位置,并使用cyclic_find定位具体偏移量。•构造payload,控制EIP(或RIP),跳转到shellcode或ROP chain。
格式化字符串漏洞:程序在处理格式化字符串时没有正确检查用户提供的格式字符串,可能导致泄露内存或执行任意代码。
解决策略: •控制格式化字符串参数,通过格式化字符(如%p或%n)来泄露内存地址。•使用泄露的地址来确定基地址或libc版本。•构造payload,利用泄露的信息来控制执行流程。
Use-After-Free:程序在释放内存后仍然访问该内存,这可能导致任意写入或执行。
解决策略: •触发UAF漏洞,重用已释放的内存块。•通过控制内存布局,比如修改__free_hook指向system函数,然后通过释放包含/bin/sh的字符串来获得shell。
Double Free:同一块内存被释放两次,这可能导致程序崩溃或任意写入
•解决策略: •触发双释放,利用特定环境下的内存布局漏洞。•通过控制释放后的内存布局,实现对其他内存的控制或利用。
整数溢出:当整数变量超出其表示范围时,可能导致计算错误,从而影响程序行为。
解决策略: •寻找整数溢出点,利用它来控制循环次数或数组索引。•构造payload,利用溢出覆盖重要数据结构或跳转地址
ASLR、NX页和Canary值:现代系统通常有各种安全机制,如地址空间布局随机化(ASLR)、非执行堆(NX)和Canary值来防止直接利用。
•解决策略: •使用泄漏技术来确定基地址。•利用ROP技术绕过NX页限制。•对于Canary值,可能需要通过特殊技术如Heap Spray或更复杂的ROP chain来绕过。
空指针解引用:程序试图访问或操作一个未初始化或已释放的指针指向的内存
•利用方式:通过控制指针的值,可以引导程序执行任意代码或泄露内存
环境变量注入:程序依赖于不可信的环境变量,这可能被恶意修改
利用方式:通过修改环境变量,可以改变程序的行为,如引导加载恶意库或执行特定代码。
文件描述符重定向:程序错误地处理文件描述符,可能导致文件内容泄露或任意文件写入。
利用方式:通过重定向标准输入、输出或错误流,可以读取敏感信息或写入特定文件。
权限提升:程序在运行时具有更高的权限,但由于错误的权限检查或资源管理,允许普通用户提升权限。
利用方式:通过利用程序的权限管理漏洞,可以执行通常需要更高权限的操
竞争条件:多个线程或进程间因同步不当,导致数据不一致或执行顺序错误。
•利用方式:通过控制并发操作的时机,可能破坏程序的正常执行流程,达到特定目的。
信息泄露:程序意外地泄露敏感信息,如内存地址、密码、密钥等
•利用方式:收集泄露的信息,可能帮助构造更复杂的攻击,如确定libc版本或基地址。
格式化字符串缺陷的变种:除了传统的%n和%x等格式化标识符,一些程序可能使用非标准或自定义的格式化字符串处理,导致额外的安全风险
利用方式:通过分析程序对格式化字符串的处理逻辑,构造特殊的格式化字符串,可以控制内存或执行任意代码。
字符串操作错误:程序在使用strncpy、strncat等字符串操作函数时未正确设置长度参数,导致溢出或数据损坏。
•利用方式:通过控制输入,可以覆盖目标内存,包括函数返回地址或其他重要数据。
信号处理:程序错误地处理信号,如SIGSEGV或SIGINT,可能导致未预期的行为或泄露敏感信息。
方式:通过触发特定信号,可以中断程序的正常流程,可能导向可利用的状态。
路径遍历:程序未正确验证文件路径,允许用户读取或写入系统中的任意文件。
•利用方式:通过构造特殊的文件路径(如../etc/passwd),可以访问敏感文件或执行系统命令
资源管理不当:程序未能正确管理资源,如文件描述符、网络连接或内存,导致资源耗尽或状态混乱。
•利用方式:通过触发资源管理的缺陷,可能使程序进入不稳定状态,便于进一步的攻击。
动态链接库(DLL)注入:程序加载恶意的动态链接库,这可能发生在环境变量、库搜索路径配置不当的情况下。
利用方式:通过替换或注入恶意DLL,可以拦截或篡改程序的函数调用,实现代码注入。
2.6构造Exploit
编写简单的Python脚本生成payload
调试与验证
0 条评论
下一页