Wargame/FTZ

FTZ level11 Write-Up

0xe82de_ 2019. 7. 23. 22:17
728x90
728x90
728x90

FTZ level11 풀어보자.

 

[사진 1]

hint를 보면 bof 문제인 것을 알 수 있다. 입력된 인자를 출력하고 프로그램을 종료한다.

setreuid 함수로 level12 계정의 권한을 획득하지만 bash 또는 sh 쉘을 실행하지 않기 때문에 쉘을 실행시켜주는 shellcode를 활용해야 한다.

 

 

[사진 2]

먼저 attackme 파일을 /home/level11/tmp/ 디렉터리에 복사해주자.

그리고 gdb를 통해 해당 파일을 실행시키면 ebp 레지스터의 값이 바뀌는 것을 알 수 있다.

따라서 환경변수를 사용하여 shellcode를 스택에 저장한 후 ret를 shellcode의 주소로 변조해야 한다.

 

 

[사진 3]

main 함수의 어셈블리어 코드를 보면 strcpy 함수를 호출하기 전에 ebp-0x108 주소를 eax 레지스터에 저장한다.

즉, ebp-0x108 이 곳이 str 변수의 시작점이다.

 

 

[사진 4]

따라서 스택은 위와 같이 형성될 것이다. str 변수부터 ebp까지의 크기는 268bytes이다.

 

 

[사진 5]

위와 같이 gdb를 통해 임의의 값 "\x90"을 268개 넣어주면 ebp까지 "\x90" 값으로 변조된 것을 확인할 수 있다.

즉, shellcode의 주소를 뒤에 입력해주면 ret는 변조되고 shellcode가 실행될 것이다.

 

 

[사진 6]

먼저 환경변수로 shellcode를 입력하자. 사용한 shellcode는 다음과 같다.

\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

shellcode 앞에 "\x90" nop 6bytes를 입력하였는데, 이 것은 shellcode가 다른 opcode와 섞이지 않도록 분리하기 위함이다. 환경변수로 입력된 shellcode의 주소를 알아내는 방법은 다음 링크를 참고하면 된다.

참고 링크: https://jade9reen.tistory.com/48

 

리눅스 환경에서 환경변수로 저장한 shellcode 주소 알아내기

bof 문제를 풀다보면 스택에 ASLR이 걸려있어 스택에 shellcode를 입력할 경우 shellcode의 주소를 정확히 알아내기 매우 어렵다. 이럴 때 환경변수에 shellcode를 저장해두고 getenv 함수로 shellcode의 주소를..

jade9reen.tistory.com

 

 

[사진 7]

그리고 위와 같이 임의의 값을 268개 입력하고 shellcode의 주소를 입력하면 ret는 변조되어 level12 계정의 권한으로 쉘을 실행할 것이다. 그리고 my-pass 명령어로 level12 계정의 password를 확인할 수 있다.

728x90
728x90