Wargame/HackCTF

    [HackCTF] wishlist (500p) 풀이 및 알게 된 점

    풀이 canary는 없고 Partial RELRO만 걸려있다. (stripped binary) input 함수에서 값을 입력받고 add_wish, view_wish, delete_wish 함수를 실행한다. input 함수에서는 BOF가 발생한다. buf는 0x10칸이지만 0x20칸을 입력받으므로 SFP와 RET를 덮을 수 있다. 새로 알게 된 기법 - Stack Pivoting Stack Pivoting은 SFP와 RET를 덮을 수 있을 때 사용할 수 있는 공격 기법이다. Stack Pivoting은 크게 2단계로 나뉜다. stage #1 - RBP Control 보통 read 함수와 같은 입력 함수는 RBP를 기준으로 입력을 받는다. BOF에서 SFP를 임의 주소로 덮고 RET를 입력 함수의 인자가 세..

    [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번 힙을 해제한다...