mini-L2025 PWN方向全题解
POSTBOX
PostScript下存在格式化字符串漏洞,具体分析如下
1 | //unsigned __int64 __fastcall PostScript(_DWORD *a1, int *len) |
且有后门函数Inval1dFunction()
那么exp如下:
1 | from pwn import * |
EASYHEAP
普通菜单堆,分析如下
1 | int del() |
采取堆块重叠的办法,申请8个大堆块再free掉
然后重新申请回来,再free掉。
则最后一个堆块被两个指针同时指向,一个指针用于free,另外一个指针用于show泄露地址
然后打house of cat的板子
1 | 0000: 0x20 0x00 0x00 0x00000004 A = arch |
沙箱禁止了open/openat,用mprotect修改权限,再编写shellcode,用openat2绕过
exp:
1 | from pwn import * |
MINISNAKE
如hints所写,撞墙和吃被写在一个线程里面
且触发一个后就会导致线程睡眠
那么吃食物的同时即可穿墙
配合number皮可以实现任意写
上下是±16,左右是±1,可以跳过canary防止crash
操作和调试过程略复杂且乏味,略过不提
通关秘籍如下:
种子 : 96630112 - 9的时候按下112 - 10的时候按右121 -10 的时候按q退出
即可getshell
Ex-Aid 2
shellcode编写题,空间充裕
不论是追求超短shellcode,leak栈地址打rop
还是用短跳连接shellcode,简单orw,打法多样,根据喜好来便可
exp如下:
1 | from pwn import * |
CTFERS
main函数下有bug(),
1 | void bug(void) |
没有开启PIE,考虑虚函数劫持
在name里面发现可以控制内容的地址
1 | nsigned __int64 join_ctf(void) |
由于对象内有name,大几率存在字符串指针
调试后确实发现存在,伪造字符串指针指向got表
调用print_info后即可泄露libc地址
观察print_info的参数传递情况,rdi、rax落在对象地址上,也就是可控地址
在libc中配合grep "call" | grep "rax" | grep "rdi"搜索gadgets
简单构造后即可构造出system("/bin/sh")
exp如下:
1 | from pwn import * |
MMAPHEAP
本人这题无法通过远程
分析原因发现,exp中一次性add了长度为0xffc0的padding用于offbynull
但是远程环境一次只能读约4000字节的payload
一开始写的时候没有考虑到pay长度太长,io会产生问题,最后发现前面的部分已经杂在一起改不动了
但是比赛已经结束,懒得改了(
所以将本地可以通过的代码放置于此
诸位看个思路便可
1 | int add() |
逆向mylib中的print函数,存在\x00截断
逆向有关结构体可得如下结构
1 | struct node_head // sizeof=0x38 |
off by null可以修改每个node里面chunk的位置
进而影响堆块申请的位置
通过off by null伪造位置,还可以导致堆块的大小出现问题
由于malloc中对size检查较弱,基本等同于向高地址的任意写
而高地址的任意写进一步导致了edit chunk_head,扩大为任意地址任意写
尽管\x00限制极其严格,我们仍可以通过堆布局
将0结尾地址上以0结尾的值当作size,并通过堆重叠实现泄露
在ld中找到pie地址,最后打回pie中的chunk_list,获得任意读写
由于对ld的查找破坏了dl_resolve,需要手动修复got表中所有需要重定向的函数
最后open /flag并read
exp如下:
1 | from pwn import * |