Wargame

    [HackCTF] AdultFSB 풀이 (700p)

    풀이 이번 FSB 문제에는 FULL RELRO가 걸려있다. AdultFSB 문제는 read 함수에서 넉넉하게 문자열을 입력 받고 총 2번 반복한다. 마찬가지로 printf 에서 FSB가 발생한다. 특이한 점은 exit(0);이 있다는 것이다. 이번 문제는 HackCTF FSB 문제중 제일 빨리 풀었던 것 같다. 전에 FULL RELRO 풀다가 exit 함수에서 free 함수를 call 한다는 사실은 알고 있었기 때문이다. 그러나, 자세하게 어떻게 exit 함수에서 free 함수를 call 하는지는 몰랐는데 이번 문제를 풀면서 새롭게 알게 되었다. kali 2019 version 기준으로 설명하겠다. 실제 문제 풀이를 위해서는 알맞은 문제 서버에 맞는 libc를 사용해야 한다. 먼저 exit 함수는 __r..

    [HackCTF] Unexploitable_4 (600p) 알아간 내용

    풀이 및 알아간 내용 특이하게 Partial RELRO를 제외하고 모든 보호 기법이 해제되어 있다. s는 [rbp-0x10]에 위치하지만, fgets 에서 0x2C 만큼을 입력받아 BOF가 발생한다. 그런데, RTL Chain을 구성하기에는 너무나도 페이로드의 길이가 짧아질 것이다. 우리는 여기서 SFP를 Control 하여 fgets의 rsi 인자를 수정할 것이고, RET로 fgets의 인자가 setting 되는 주소로 돌아가 필요한 만큼 재입력을 받을 것이다. SFP를 수정한 채로 RET로 돌아가면 fgets의 rsi가 [rbp-0x10]을 가리키고 있기 때문에 원하는 주소에 값을 적어줄 수 있다. 해당 문제에서는 RWX가 켜져 있으므로 bss 근처에다 입력을 받으면 될 듯하다. 입력받는 값은 NX가..

    [HackCTF] ChildFSB (600p) 풀이

    풀이 Thanks to tmxk4221 babyfsb와는 달리 read에서 0x19 크기만 입력을 받는다. setvbuf, setbuf로 세팅한다. childfsb의 exploit은 3단계로 나눌 수 있다. stage #1 __stack_chk_fail@got 값을 main+33 값으로 덮는다. 왜 main+33 값인지는 stage #3에 나온다. 그리고 스택에 남아있는 __libc_start_main+240 값을 leak 한다. 이제 stack smashing을 일으켜, main+33으로 돌아간다. stage #2 leak을 성공했다면 oneshot_gadget을 구한다. babyfsb와 마찬가지로 oneshot_first, oneshot_mid, oneshot_last로 offset을 나눠준다. st..

    [HackCTF] 훈폰정음 풀이 (700p)

    풀이 [*] '/root/pwnable/pro42/hun' Arch: amd64-64-little RELRO: Full RELRO Stack: Canary found NX: NX enabled PIE: PIE enabled 풀었다! 내가 이렇게 힙 문제를 빨리 풀 줄이야.. 프로그램을 실행하면 다음과 같은 메뉴가 나타난다. IDA로 슈도코드를 확인해 보자. menu를 출력하고 smooth라는 함수로 값을 입력 받는다. add, edit, delete, check, exit를 선택할 수 있다. 마찬가지로 smooth 함수로 입력을 받는다. 그 후, v1으로 입력 값을 넘기는데 Index가 0 ~ 6 사이인지 검사한다. 만약, 아니라면 함수를 종료한다. heap size는 음수가 될 수 없으며, 1024를 ..

    [HackCTF] ChildHeap 풀이 (500p)

    풀이 [*] '/root/pwnable/pro34/childheap' Arch: amd64-64-little RELRO: Partial RELRO Stack: Canary found NX: NX enabled PIE: No PIE (0x400000) 먼저 프로그램을 실행해봤다. 1번 메뉴에서는 malloc을 받고, 2번 메뉴에서는 free 기능을 수행한다. IDA로 확인해보자. 그냥 무난한 main 함수다. Malloc 함수에서는 Index와 size에 제한을 둔다. 0번부터 4번까지의 인덱스를 사용할 수 있다. size는 0부터 128까지 넣을 수 있다. 이를 통해 0x80을 free 함으로써 unsorted bin을 만들 수 있다. Free 함수에서는 값을 free 시키고 값을 삭제하지 않는다. 즉,..

    [HackCTF] ROP 풀이 (300p)

    풀이 Arch: i386-32-little RELRO: Partial RELRO Stack: No canary found NX: NX enabled PIE: No PIE (0x8048000) 입력을 받고, Hello, World!를 출력한 뒤 프로그램을 종료한다. ROP 문제라고 나와있는 만큼, 정석적인 ROP 문제로 보인다. 32bit ROP니, read write를 적절히 이용해 문제를 풀어주면 된다. 1. write로 read@got leak 2. read로 bss 영역에 /bin/sh 입력 3. read로 write@got overwrite 또는 1. write로 read@got leak 2. libc base를 구해 system 실행 from pwn import * context.log_leve..

    [HackCTF] UAF 풀이 (300p)

    풀이 Arch: i386-32-little RELRO: Partial RELRO Stack: Canary found NX: NX enabled PIE: No PIE (0x8048000) 힙 관련 입력을 받고 프로그램을 종료한다. print_note 함수에 notelist[v1]이 있다면 저 네모난 부분을 call 하는 데, 저기에 print_note_content가 들어가 있어 함수를 실행하는 방식으로 코드가 짜여져있다. 그렇다면 우리는 저 부분에 magic 함수를 넣어 쉘을 따면 될 듯 하다. UAF(Use After Free)를 안다는 가정하에 설명을 적을 것이다. 1. 8byte(AAAA) 힙을 할당한다. 2. 8byte(BBBB) 힙을 할당한다. 3. 1번 힙을 해제한다 4. 2번 힙을 해제한다...

    [HackCTF] Pwning 풀이 (300p)

    풀이 Arch: i386-32-little RELRO: Partial RELRO Stack: No canary found NX: NX enabled PIE: No PIE (0x8048000) 원하는 사이즈를 입력하고 data를 입력받고 프로그램을 종료한다. size를 입력받는 데 32 이상이면 프로그램이 종료된다. overflow를 발생시키려면 무조건 nptr의 크기보다 크게 입력을 받아야한다. 이 문제는 간단하게 Integer underflow를 이용해 해결할 수 있다. (Integer underflow를 모른다면 꼭 찾아보시길) size에 -1를 넣어 크기를 아주 많이 넉넉하게 늘려주자. 그 후, ROP를 이용해 쉘을 따주면 된다 from pwn import * #context.log_level = ..