pwnable(17)
-
[CTF write up] SECCON CTF 2022 Qual - Babyfile : Hard FSOP Challenge
int __cdecl main(int argc, const char **argv, const char **envp) { int idx; // eax char offset; // [rsp+7h] [rbp-9h] FILE *fd_null; // [rsp+8h] [rbp-8h] alarm(0x1Eu); write(1, "Play with FILE structure\n", 0x19uLL); fd_null = fopen("/dev/null", "r"); if ( fd_null ) { fd_null->__pad2 = 0LL; while ( 1 ) { idx = menu(); if ( idx == 2 ) { write(1, "offset: ", 8uLL); offset = getint(); if ( offset < ..
2022.11.21 -
[CTF write up] DEF CON CTF 2022 Qual - smuggler's cove : Open-Source Exploitation
일반적인 포너블 문제와 달리 netcat이 아닌 웹을 통해 접속해야 한다. 웹에서 사용자로부터 Lua Script를 받고 이를 오픈소스 Lua 컴파일러인 LuaJIT으로 실행한다. 이때, LuaJIT은 공유 파일(so) 형태로 있으며, C로 코딩된 커스텀 바이너리에서 해당 공유 파일을 import 하고 사용자의 Lua Script를 실행한다. 바이너리를 분석해보면 일반적인 Lua 함수는 사용할 수 없으며, C로 구현된 print 함수와 Cargo 함수만을 Lua Script 내에서 이용할 수 있다. 취약점 역시 C로 구현된 함수에 존재하는데, Cargo 함수를 이용하면 사용자가 Lua Script에서 정의한 함수를 가리키는 포인터를 오염시킬 수 있다. 취약점 자체는, 커스텀 Lua 함수를 구현하는 바이너..
2022.05.30 -
[CTF write up] m0lecon CTF 2022 - ptmList : Intager Overflow and List OOB
from pwn import * def up(): p.send(b'w') def down(): p.send(b's') def go(): p.send(b'\n') def esc(): p.send(b'\x1b') def drop(): p.send(b'd') def move(): p.send(b'm') def exploit(): go(); for i in range(0,231): down(); go(); down(); go(); esc(); go(); down(); go(); down(); go(); esc(); go(); down(); go(); down(); go(); esc(); down(); down(); go(); go(); # secret gift down(); go(); drop(); go(); ..
2022.05.15 -
[CTF write up] WITHCON 2021 - chunk_manager : Unsorted bin leak (WhiteHatContest)
당시 솔버 수가 굉장히 적은 문제였던 걸로 기억하는데, 지금 풀어보니 말도 안되게 쉬운 문제였다.. 풀고 난 후 출제진 설명을 보니 AAW 취약점으로 breaking calloc 버그를 일으켜 메모리 주소를 유출하는 것이 의도된 풀이인 것으로 확인된다. 하지만 breaking calloc 트릭을 알지 못하더라도 unsorted bin의 특징을 알면 매우 쉽게 메모리를 유출 할 수 있다. 작은 크기의 청크 할당이 요청 될 경우 unsorted bin에 청크가 있을 때 해당 청크를 떼주게 된다. 따라서 큰 unsorted bin 크기의 청크를 해제하고 작은 크기의 청크를 할당하면 unsorted bin에 들어있는 프리 청크 바로 위에 요청한 청크가 할당된다. AAW로 내부 값을 전부 채워주면 unsorted..
2022.05.02 -
[CTF write up] HayyimCTF 2022 - MemoryManager : Child VM challenge
__int64 __fastcall main(int a1, char **a2, char **a3) { void *vm_name; // [rsp+0h] [rbp-80h] __int64 rs; // [rsp+8h] [rbp-78h] Vmware vm; // [rsp+10h] [rbp-70h] BYREF unsigned __int64 canary; // [rsp+78h] [rbp-8h] canary = __readfsqword(0x28u); vm_name = calloc(1uLL, 0x40uLL); sub_40230D(); offsetunk = -1; memset(&vm, 0, 0x60uLL); vm.SP = int::0x1000; vm.BP = int::0x1000; heap_addr = (__int64)&h..
2022.02.18