System/FTZ

[FTZ school] level 11

BadSchool 2019. 3. 19. 03:45

▲ level11의 파일리스트. 누가봐도 눈에띄게 공격해 달라는 빨간색 파일과 힌트 파일이 보인다.


1
2
3
4
5
6
7
8
9
10
11
12
#include <stdio.h>
#include <stdlib.h>
 
int main( int argc, char *argv[] )
{
    char str[256];
 
    setreuid( 30923092 );
    strcpy( str, argv[1] );
    printf( str );
 
cs

▲ 코드를 보기쉽게 다시 올려보았다. attackme의 소스파일로 보인다. 인자값을 입력받아 strcpy의 취약점을 이용해 공격하는 문제이다.


▲ esp에 sub 0x108을 해주는 모습. 즉 스택에 264byte 만큼의 공간을 할당해 주었다. 따라서 현재 메모리 구조는 그림과 같이 보인다(편의상 EBP로 적는다).

+ 왜 dummy값이 8byte인가요??? ---> 264byte의 할당 값 중 str이 256byte를 사용하고 있기 때문.


따라서 우리는 str+dummy 의 264byte에 셸 코드와 NOP으로 채워 준 후 EBP 부분을 쓰레기 값으로 채워 준 후 RET 부분에 셸 코드로 넘어가는 주소값을 넣어주면 된다.


▲ 간단한 perl 언어로 a를 268개, A를 4개 입력한 모습 보이는 것과 같이 str시작 주소는 0xbfffee40

RET는 0xbffffb20, EBP는 0xbfffee60 이 된다. 그렇다면 셸 코드+nop 264byte + dummy 4byte + 쉘주소 4byte를 입력해 주면 되겠습니다............... 하지만 해당 프로그램에는 랜덤스택주소 방어기법이 적용되어 있어 성공이 되지 않습니다. 브루트 포스를 하는 방법도 있지만 저는 그것이 아닌 RTL 공격 기법을 이용해 보겠습니다.


++ RTL 공격 기법이란?

Retrun To Libc 즉 리턴 주소를 공유 라이브러리 주소로 바꿔 실행하게 되는 것이다. 즉 쉘코드를 직접 작성하지 않고 라이브러리 함수를 이용하게 됩니다.


=============다시 처음부터 ㅎㅎ=======================================


▲ gdb로 main에 bp를 걸어준 다음 print함수를 이용해서 system함수의 주소를 알아냈습니다. 이제 execve에 /bin/sh를 실행해야 하는데요. system 함수 안에 execve가 있으므로 그걸 찾아내야 합니다. 저는 간단한 반복문으로 찾아보도록 하겠습니다.


▲ 코드 사진


▲ 주소는 0x42127ea4

자 그러면 이제 알아내야 할 것은 다 알아냈습니다.

system 함수 주소 : 0x4203f2c0,    /bin/sh 주소 : 0x42127ea4

따라서 NOPx268 + 0x4203f2c0 + NOPx4 + 0x42127ea4 를 입력해 주면 됩니다.


▲ 처음에 perl언어로 작성하였는데 아무리 해도 16진수 값이 들어가지 않아서 파이썬으로 짰습니다.

./attackme `python -c 'print "\x90"*268+"\xc0\xf2\x03\x42"+"\x90"*4+"\xa4\x7e\x12\x42"'`