전체 글

전체 글

    [glibc version problem] tcache 2.27 dfb

    glibc 2.29 버전에서는 dfb를 방어하기 위한 코드가 추가되어서 단순한 방법으로는 dfb가 먹히지 않는다. 즉, CTF나 Wargame 문제에서 glibc 2.26 or 2.27 version을 줄 때가 많은데 지금까지 2.29로만 시도해서 tcache 관련 문제들은 모두 상상 익스플로잇(?)으로 풀었다. 혹시 나와 같은 사람이 있을까 봐 적어본다. 처음에는 Ubuntu나 Debian으로 시도해봤는데 apt를 update 할 때마다 Broken Pipe나 dependancy 오류가 계속 떠서 찾다가 찾다가 Kali에서 glibc 2.27 버전을 찾아봤다. double free bug detected in tcache 2 문구는 tcache에서 dfb가 발생할 때 glibc 2.27 일부 버전과 그..

    [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 시키고 값을 삭제하지 않는다. 즉,..

    [Heap] Tcache dup glibc_2.29 & tcache dfb bypass

    보호되어 있는 글입니다.

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