HackCTf

    [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 = ..

    [HackCTF] Gift 풀이 (250p)

    풀이 Arch: i386-32-little RELRO: No RELRO Stack: No canary found NX: NX enabled PIE: No PIE (0x8048000) 첫 입력은 그대로 출력하고, 다음 입력을 받고 프로그램을 종료한다. 딱히 설명할게 없는 문제다. 프로그램을 실행하면 binsh와 system의 주소를 주는 데, 그냥 ROP로 입력받고 system(binsh)를 실행하면 끝이다. from pwn import * context.log_level = 'debug' p = remote('ctf.j0n9hyun.xyz', 3018) e = ELF('./gift') pr = 0x80483ad p.recvuntil('are: ') binsh_address = int(p.recv(9),1..

    [HackCTF] Look at me 풀이 (250p)

    풀이 Arch: i386-32-little RELRO: Partial RELRO Stack: No canary found NX: NX enabled PIE: No PIE (0x8048000) Hellooooooo라는 문구가 뜨고 입력을 받고 프로그램을 종료한다. 누가봐도 v1에 overflow가 일어난다. 간단하게 ROP로 풀어주면 될 듯 하지만, 이 바이너리는 statically linked다. 오래전에 풀어서 기억은 잘 안나는데 아마 mprotect로 풀었던 거 같다. mprotect 함수는 NX bit가 걸려있어도, 메모리 영역의 권한을 바꿔 쉘 코드를 실행할 수 있게 만들어준다. int mprotect(void *addr, size_t len, int prot); addr에는 메모리 주소, len..

    [HackCTF] Beginner_Heap 풀이 (250p)

    풀이 기말고사 때문에 풀고도 포스팅을 못한 문제들의 풀이를 쭉 적을 것이다. Arch: amd64-64-little RELRO: Partial RELRO Stack: No canary found NX: NX enabled PIE: No PIE (0x400000) 2번 입력을 받고 프로그램을 종료한다. 아래 Bold 글씨로 표시한 것만 봐도 코드의 흐름이 어떻게 흘러 가는지 알 수 있을 것이다. gdb-peda$ x/32x 0x602290 0x602290: 0x0000000000000000 0x0000000000000021 0x6022a0: 0x0000000000000001 0x00000000006022c0 0x6022b0: 0x0000000000000000 0x0000000000000021 0x6022c..

    [HackCTF] BOF_PIE 풀이 (150p)

    문제 종류 - Pwnable 사용한 툴 - IDA nc ctf.j0n9hyun.xyz 3008 풀이 일단 IDA로 파일을 열어보자. 수상해 보이는 2개의 함수가 있다. 일단 main부터 봐보도록 하자. main에서는 welcome 함수를 호출하고 프로그램을 종료한다. 이번 문제는 main이 주가 아닌가 보다. welcome 함수에서는 j0n9hyun의 주소 값을 출력하고 scanf로 값을 하나 받는다. 일단 scanf에서 bof가 일어나는 듯하다. j0n9hyun 함수는 flag를 출력해주는 함수다. 그런데 문제를 보면, PIE라고 적혀있다. PIE는 메모리 보호 기법 중 하나로, binary가 랜덤한 주소를 갖게 된다. 그래서 프로그램에서 출력해주는, 주소로 공격을 시도하면 당연히 페이로드가 동작하지 ..

    [HackCTF] Offset 풀이 (150p)

    문제 종류 - Pwnable 사용한 툴 - IDA nc ctf.j0n9hyun.xyz 3007 풀이 IDA에 파일을 넣어보자. main 함수 부분이다. gets로 s를 입력받고, select_func 함수에 s를 넘겨준다. select_func 함수는 포인터 함수 v3에 two를 일단 넣고, src를 복사한 dest가 one이면 one을 리턴, one이 아니면 two를 리턴한다. 여기서 리턴 함수가 one, two가 아니라 print_flag라는 함수라면? 이제 gdb를 실행해보자. select_func 끝 부분에서 eax를 call 한다. eax에는 함수의 반환 값이 저장되는데, 이 부분에 bp를 걸고 eax 값을 확인하자. 이 값을 입력한 값이 저장되어 있는, ebp-0x2a 근처에서 찾아보도록 하자..