목록분류 전체보기 (84)
hiariz 님의 블로그
안녕하세요.이번 글에서는 제가 처음으로 참가했던 Pwn2Own Berlin 2026 참가 후기를 작성해보려고 합니다. Zero Day Initiative — Announcing Pwn2Own Berlin for 2026If you just want to read the contest rules, click here . Willkommen zurück, meine Damen und Herren, zu unserem zweiten Wettbewerb in Berlin! That’s correct (if Google translate didn’t steer me wrong). After our inaugural competition last year, Pwn2www.thezdi.com 지난 3월, CTF..
개요이 문제의 핵심은 Maglev가 배열 length를 추적하는 방식이 패치로 깨졌다는 점이다. 원래 push는 하나의 길이값을 기준으로 grow 여부를 판단하고, 같은 길이를 index로 사용해 값을 저장한 뒤, 마지막에 새 길이를 기록해야 한다. 그런데 패치 후에는 이 과정에서 두 개의 길이값이 섞여 쓰인다. 하나는 Maglev가 이미 알고 있다고 믿는 cached length이고, 다른 하나는 실제 힙의 JSArray::length 필드에서 다시 읽어 온 fresh length다. 문제는 grow 판단은 cached length로 하고, 실제 element store와 실제 length 갱신은 fresh length로 한다는 점이다. 여기에 push/pop 이후 property state를 기록할 ..
https://ctf.dicega.ng/challenges?challenge=pwn_garden ctf.dicega.ng문제 구조이 바이너리는 간단한 VM 인터프리터입니다. VM 오브젝트는 별도의 4GB VM heap에 올라가고, off-heap object의 실제 데이터는 calloc()으로 glibc heap에 할당됩니다.또 VM operand stack도 realloc()으로 커지기 때문에 glibc heap 위에 존재합니다. 즉 메모리 레이어가 세 개 있습니다.VM heapglibc heapnative stack처음에는 이 셋이 잘 분리된 것처럼 보이지만, 실제 취약점은 이 경계를 무너뜨리는 데에 있습니다.핵심 버그가장 중요한 코드는 allocator 쪽입니다.typedef uint32_t ref..
https://ctf.dicega.ng/challenges?challenge=pwn_bytecrusher ctf.dicega.ng 이 문제는 두 개의 버그가 자연스럽게 이어지는 전형적인 pwn 문제였다.free_trial()에서 crush_string()를 잘못 사용해서 스택 바깥 읽기(OOB read)가 가능하다.get_feedback()에서 gets()를 사용해서 스택 오버플로우가 가능하다.문제 시작문제 설명은 "문자열을 crush 해주는 서비스" 정도의 컨셉이고, 서버에 접속하면 16번의 무료 trial을 준다.실제로 소스를 보면 구조는 꽤 단순하다.void free_trial() { char input_buf[32]; char crushed[32]; for (int i=0; i이 ..
Plaid CTF 2025 plaidctf.com 이번 문제는 무려 당시 제로데이 취약점을 이용하여 redis 프레임워크를 상대로 셸을 얻어야하는 문제였습니다. 따라서 문제 풀이자는 없었고 향후 제로데이 취약점이 CVE-2025-32023로 공개되어 익스 PoC만 존재하는 상태였습니다. 이 문제 풀이를 위해 LLM(Codex 5.3)을 사용하여 외부 자료 참조 없이 오로지 소스코드로만 문제를 풀이한 방식을 기록해보겠습니다. 먼저 codex에게 다음과 같이 프롬포트를 줍니다.redis 7.4.2 소스코드를 통해 ctf 문제를 풀어야해. 일단 코드들을 분석해서 플래그를 얻기 위한 셸 인터렉티브를 할 수 있을만한 포인트가 뭐가 있는지 찾아봐줘 외부 cve나 패치 정보와 같은 공개된 정보를 찾지말고 오로지 소스..
Plaid CTF 2025 plaidctf.com1. 개요이 익스는 단일 버그 1개라기보다 다음 조합으로 성립합니다.mpz 객체를 in-place로 계속 갱신하는 연산 구조parse_with 재사용(mpz_swap)으로 내부 포인터 교환이 반복되는 구조drop으로 참조를 제거한 뒤 GC/finalizer 타이밍이 개입하는 구조mpz_get_str가 _mp_d를 그대로 따라 읽는 출력 구조결과적으로 살아 있는 객체의 내부 포인터(_mp_d)가 stale/오염된 상태가 되고,그 상태가 leak primitive와 write primitive로 이어집니다.2. 핵심 코드 근거2.1 in-place 연산 (dst=next)src/ocalc.ml| top :: next :: rest -> f ~dst:nex..