pwn
devnull-as-a-service
description
A few months ago, I came across this website. Inspired by it, I decided to recreate the service in C to self-host it.
To avoid any exploitable vulnerabilities, I decided to use a very strict seccomp filter. Even if my code were vulnerable, good luck exploiting it.
PS: You can find the flag at /home/ctf/flag.txt
on the remote server.
程序逻辑很简单,gets栈溢出,静态链接没有pie但是开启了seccomp
1 | int __cdecl main(int argc, const char **argv, const char **envp) |
seccomp规则,可以使用openat代替open然后read wrtie将flag读出来
1 | line CODE JT JF K |
但是程序中找不到syscall ;ret 这类gadget,需要连续三次系统调用,想了一下直接用mprotect将bss的权限改成r | w | x的,往里面写orw_assemble直接跳过去就好了
exp
1 | from pwn import * |
pwny-heap
description
ponys like the heap so i made pwny heap
1 | Arch: amd64-64-little |
glibc 2.35的堆,程序逻辑
1 | __int64 __fastcall main(int a1, char **a2, char **a3) |
有uaf但是存在一个自定义的inuse标志位,在写数据的时候会检查这个标志位,可以通过ptmalloc分配策略绕过这个标志位的检查,在某某大小的bin为空的情况下,可以通过create(0,0x78) delete(0) create(1,0x78) 这个方法让chunklist中有两个相同的地址,但是标志位不同的堆块,之后就可以编辑free状态的堆块了.
放两个堆块进unsortedbin,一个用于泄露libc 一个用于泄露堆地址,拿到堆地址后就可以绕过safe link用tcache poison实现任意地址申请,首先泄露environ的地址拿到栈地址,然后申请到main函数栈帧覆盖main的返回地址 往里面写rop 最后 exit触发rop getshell
exp
1 | from pwn import * |
secure-sandbox
description
I love to make little games. But this time something seems to be different. If you win you might even get a flag…
no pie
1 | int __cdecl main(int argc, const char **argv, const char **envp) |
子进程中设置了seccomp bpf并且可以执行shellcode,bpf规则是
1 | line CODE JT JF K |
可以发现orw差个r,但有lseek系统调用且程序没有pie,seccomp的规则只在子进程中生效,可以利用linux映射到文件系统奇奇怪怪的接口,如open proc/pid/mem配合lseek去读写父进程中的内存,因为是在内核态进行的,所以text段 rdata这些用户态看来没有写权限的段也可以写,利用writev在waitpid地址后写shellcode
1 | .text:0000000000401C8A E8 F1 77 04 00 call waitpid |
writev需要构造一个iovec的结构体,shellcode的构造可以低地址写字符串,结构体以及shellcode,高地址写open lseek writev的系统调用,之间用相对偏移跳转链接
exp
1 | from pwn import * |