justCTF2025-Pwn部分WP
字数 1734 2025-09-01 11:25:54
justCTF2025 Pwn题目分析与利用技术详解
shellcode_printer题目分析
程序功能与漏洞点
- 程序使用
mmap分配一块可读可写可执行的内存区域(addr) - 程序通过
stream打开一个"黑洞文件" - 使用循环将用户输入通过
fprintf写入该文件 - 关键漏洞:
fprintf存在格式化字符串漏洞 addr每次循环后自增2
利用思路
- 利用格式化字符串的
%c和%hn一次性向addr区域写入2字节shellcode - 在
addr区域先写入read调用,再写入完整shellcode - 利用
addr自增特性,使用jmp loop(\xee\xfe)短跳使RIP回到addr起始地址 - 当执行到
read的shellcode时,RSI正好指向syscall的下一个地址,可完成shellcode续写
EXP关键点
- 需要爆破,成功率约为1/8
- 使用格式化字符串漏洞构造特定字节写入
- 利用短跳实现循环执行
prospector题目分析
程序功能与漏洞点
- 使用
mmap申请可读可写的地址区域 sub_10FD函数存在223字节的栈溢出- 可覆盖
v4控制第二次输入失败,构造无限循环和任意地址写 sub_1075中的sub_1000可泄漏mmap申请地址的内容
利用思路
- 泄漏的地址为
mmap申请地址前四个字节相加去掉最高字节 - 接收泄漏地址后还原最高字节并整除2得到
mmap地址前4字节 - 通过GDB确定地址最后三位为0,只需爆破1字节
mmap地址与ld-linux-x86-64.so.2偏移固定- 利用
ld-linux-x86-64.so.2中的ROP链劫持程序流
EXP关键点
- 泄漏地址会在栈上造成破坏,需覆盖返回地址后固定位置为1
- 不能通过原返回地址返回,需利用多层函数调用的栈结构
- 劫持1字节返回到
syscall附近位置 - 控制RBP为
mmap申请地址,利用第二次read写入数据控制寄存器
jctfcoin题目分析
程序功能与漏洞点
- 堆题目,
sub_1753存在堆溢出可覆盖下一个chunk的size字段 - 可造成堆块吞并
- 程序加载了自定义libc但非必要
add函数会额外增加0x20堆块大小
利用思路
- 申请大块中间夹2个小块的形式
- 修改第一个大块将4个堆块全部放入unsortbin
- 申请第一个大块大小的堆块,可在第一个小块中show出libc地址
- 将2个小块作为一个堆块申请出来,控制第二个小块的fd地址
- 泄漏heap基地址,使用tcachebin attack劫持
__IO_list_all - 最后攻击house of apple2实现getshell
EXP关键点
- 远程和本地heap地址偏移可能相差0x30
- 需要精确计算堆布局
- 利用堆溢出修改关键size字段
- 组合使用unsortbin和tcachebin技术
babyheap题目分析
程序功能与漏洞点
delete_chunk中存在UAF漏洞- 程序只能申请和使用0x30大小的堆块
利用思路
- 泄漏堆地址和key后攻击heap头或修改其他chunk的size
- 通过释放操作获得libc地址
- 获得libc地址和heap基地址后
- 劫持
__IO_list_all并在堆上构造house of apple2
EXP关键点
- 需要精确控制堆布局
- 利用UAF泄漏关键信息
- 使用house of apple2技术完成利用
通用技术总结
-
格式化字符串利用:
- 使用
%hn等格式化字符实现精确内存写入 - 结合程序特性构造循环执行
- 使用
-
堆利用技术:
- 堆溢出修改size字段
- unsortbin和tcachebin的组合利用
- UAF漏洞的信息泄漏
- house of apple2攻击技术
-
地址泄漏与计算:
- 通过部分泄漏信息还原完整地址
- 爆破少量字节提高利用成功率
- 固定偏移的计算与利用
-
ROP链构造:
- 利用ld.so中的gadget
- 栈破坏情况下的返回控制
- 多层函数调用栈的利用
以上技术细节和利用方法在实际漏洞利用中需要根据具体环境进行调整,特别是地址计算和爆破部分需要充分考虑目标环境特性。