ID : level11
password : what!@#$?
1) 11단계도 마찬가지로 cat 명령어를 통해 hint 파일을 열어보았다.
단순 코드로만 되어있는 힌트이다.
main 함수가 실행되면, 3092 권한을 얻고 argv 배열의 내용을 str 변수에 복사하여,
str 의 내용을 출력하게 된다.
일단, level12 권한의 파일을 찾아보자
2) attackme 파일이 12레벨 권한이 걸려있음을 알수있다.
일단 실행해 보자
3) Segmentation fault 라는 문구가 뜬다.
그럼 힌트에 있던 코드를 복사하여
프로그램을 만들어 보자!
4) cat 명령어를 사용해 해당 코드를 저장하고
이제 컴파일을 해준다.
5) gcc 명령어를 통해서 컴파일을 해준다.
이제 해당 프로그램을 실행해 보자
6) 해당 프로그램을 실행하여도 세그멘테이션 오류가 뜬다.
구글링을 통해 해당 세그멘테이션 오류에 대해 알아보았다.
* 세그멘테이션 오류의 정의
7) 해당 코드에 입력되는 값이 없어 발생하는 오류이므로,
코드를 간단하게 수정해 보았다.
다시 컴파일을 해준후 실행 해 보도록한다.
* 실행해도 아무반응이 없다.
or 만 출력될뿐..
이 방법이 아닌거 같아 결국 구글링을 해 보았다
문제는 strcpy 를 보아 BOF공격을 해야하는것으로 보였다.
8) 일단 gdb 명령어를 통해 attackme 파일을 어셈블리어로 변경후 코드를 살펴보았다.
스택 포인터 에서 16진수 108을 빼는 것을 확인해보자.
해당 코드에서 str 변수에 할당된 크기는 256이다,
108 을 10진수로 변환하면, 264 가 된다.
256 + 8 .. 8byte가 dummy(쓰레기값)으로 할당된것을 확인할수 있다.
해당 구조는 다음과 같다.
또한, main+9 라인을 보면 8바이트를 추가적으로 빼주는것을 확인할수 있다.
메모리 구조상 보게되면,
SFP 와 RET 가 4 바이트씩 할당된것을 확인할수 있을것이다.
* SFP : 실행될때, 이전 BP 의 주소
* RET : 돌아갈 주소 ( return )
따라서 메모리 구조는
이렇게 표혀할수 있다.
이제 이론적으로 접근해보면, str에 변수 256을 넘어서
오버플로우를 발생시켜 RET에 실행될 쉘 코드를 넣어주면 권한 12을 뚫을수 있을것이다.
256 + 8 + 4 + 4 = 272 byte가 된다.
그럼 , 할당되는 변수에 오버플로를 발생시키기 위하여,
256 + 8 + 4 까지의 값을 아무거나 채워주고 , 나머지 4바이트 ( return )에는 권한을 뚫을수 있는 쉘 코드를 입력하면 될것이다.
일단, 쉘코드를 알아보자
shell_code:
\x31\xc0\x31\xdb\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\x31\xc0\xb0\x01\xcd\x80
해당 코드는 bash 쉘을 띄워주는 코드이다.
이 코드를 어딘가에 등록한후, RET값에 이 주소를 호출하면 12권한의 레벨이 뚫릴것이다.
해당 쉘 코드를 환경변수에 등록후 , 해당 환경변수의 주소를 불러오도록 하자.
9) 일단 export 명령어를 사용하여 해당 환경변수 목록을 확인해 본다.
10 ) export 명령어를 통해 해당 쉘 코드의 환경변수를 저장한다.
export HACKER=`python -c 'print "\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\x31\xc0\xb0\x01\xcd\x80"'`
11) 다시 export를 입력하면 저장한 환경변수를 확인할수 있다.
이제 해당 환경변수의 주소값을 알아내는 간단한 코드를 짜야한다.
12) 위와 같은 코드를 입력하고, 컴파일후 실행해 보자
13) 해당 환경변수의 주소는
0xbfffff00 이다!
이제 이를 ret 에 할당하면 된다!
14) 위처럼, 아무 문자나 268 자리를 채워주고, ret 가 되는 4바이트에는 환경변수의 주소를 할당하도록 하니
level12의 쉘이 출력되었다!
15) id 명령어를 사용 하여도 level12 권한을 획득한것을 알수 있다.
16) my-pass 명령어를 사용하여 다음 관문의 패스워드를 알아냈다.
"it is like this"