๐ธ[๋ด๋ถCTF2025-pwn]Forty-Seven-Bells
๐ก ๋ฌธ์ ์ถ์ฒ
๋ฌธ์ ๊ตฌ์กฐ
C:.
โ Dockerfile
โ flag
โ get-docker.sh
โ libprob.so
โ prob
โ
โโfor_user
โโ__MACOSX
โ ._for_user
โ
โโfor_user
._Dockerfile
._flag
._libprob.so
._prob
๐ก ์ ์ฒด ๋ก๋๋งต
CykorCTF2025-asterisk ํ์ด ์ ์ฒด ๋ก๋๋งต
1. Premitive - Static Analysis
์ํ๊ณต๋ถํ๋ค๊ฐ ๋๋ฌด ์กธ๋ ค์ ์ ๋ ๋กธ์
..
ํ๋ชจํ๋ชจ๋น,, ๊ต์๋๊ป์ ๋ต์ฅ์ด ์ค์ง์๋๋ค
- ,,,
์ ์ฒด ํจ์ ๋ชฉ๋ก ํ์ธ: main, _start, _init, _fini ํ์ค ์ง์ ์
main ํจ์ ํ์ธ: dlopen, dlsym, dlerror ๋์ ๋ผ์ด๋ธ๋ฌ๋ฆฌ ๋ก๋ฉ -
fopen,fread,fcloseโ ํ์ผ I/O
-
mmap,srand,rand-> ๋ฉ๋ชจ๋ฆฌ/๋๋ค ์ ์ฌํญ๋ค์ ๊ฐ์ฃผ์ด๋ดค์ ๋, ์ธ๋ถ .so ํ์ผ์ ๋ฐํ์์ ๋ก๋ํจ. ์ฆ, prob์ ๋ก๋์ผ ๋ฟ ์ค์ ๋ก์ง์ libprob.so(์์ ๋ก๋ํด์ค๋ challenge_main)์ ์์
main ์ธ๋ถ ์ฌํญ
// 1. ๋๋ค ์๋ ์ค์ (urandom ๋๋ time) fopen("/dev/urandom", "r"); srand(seed); // 2. ๋๋ค ํจ๋ฉ mmap (์์ฒด PIE ๊ตฌํ) local_24 = (rand() & 0xff) << 0xc; // 0 ~ 255 ํ์ด์ง mmap(NULL, local_24, ...); // 3. libprob.so ๋ก๋ dlopen("./libprob.so", RTLD_NOW); // 4. challenge_main ํจ์ ์ฐพ์์ ํธ์ถ pcVar4 = dlsym(handle, "challenge_main"); (*pcVar4)(); // challenge_main() ํธ์ถ -
- libprob.so์ challenge_main ๋ถ์
libprob.so์ ํจ์ ๋ชฉ๋ก ํ์ธ
readelf ๋ช ๋ น์ด //libpro.so์์ custom๋ ํจ์๋ค์ ์คํ์ ์ ๋ค์๊ณผ ๊ฐ์. present @ 0x74c santa @ 0x7f5 rudolph @ 0x825 elves @ 0x899 challenge_main @ 0x8e1 prologue @ 0x799void challenge_main(void) { undefined4 local_14 [2]; setvbuf(stdin,(char *)0x0,2,0); setvbuf(stdout,(char *)0x0,2,0); do { prologue(); __isoc99_scanf(&DAT_00010ae8,local_14); getchar(); switch(local_14[0]) { case 1: santa(); break; case 2: rudolph(); break; case 3: elves(); break; case 4: puts("Bye!"); /* WARNING: Subroutine does not return */ exit(0); default: puts("Invalid choice!"); } } while( true ); }challenge_main์ ๋จ์ํ ๋ฉ๋ด๋ฅผ ์ ๊ณตํ๋ ํจ์
- challenge_main์ ๊ฐ ๋ฉ๋ด๊ฐ ๋๋ ํจ์ ๋ถ์
//1์ผ๋ ํธ์ถ๋๋ santa() void santa(void) { undefined1 auStack_c [4]; printf("Index: "); __isoc99_scanf(&DAT_00010ac0,auStack_c); return; } //2์ผ ๋ ํธ์ถ๋๋ roudolgh() void rudolph(void) { undefined4 local_18; int local_14 [2]; printf("Index: "); __isoc99_scanf(&DAT_00010ac0,local_14); printf("Value: "); __isoc99_scanf(&DAT_00010acc,&local_18); *(undefined4 *)(&bss_buffer + local_14[0]) = local_18; puts("Written!"); return; } //3์ผ ๋ ํธ์ถ๋๋ elves() void elves(void) { char acStack_108 [255]; undefined1 local_9; printf("Message: "); read(0,acStack_108,0xff); local_9 = 0; printf(acStack_108); putchar(10); return; } //4์ผ ๋๋ puts(Bye!)