Wargame/FTZ

FTZ level17 Write-Up

0xe82de_ 2019. 7. 24. 01:52
728x90
728x90
728x90

FTZ level17 풀어보자.

 

[사진 1]

hint를 보면 이전 문제와 거의 비슷하다. 하지만 shell 함수가 없기 때문에 환경변수에 shellcode를 입력하고 shellcode의 주소로 printit 함수를 호출하는 주소를 변조해야 한다.

 

 

[사진 2]

먼저 attackme 파일을 /home/level17/tmp/ 디렉터리에 복사한다.

그리고 gdb로 main 함수의 어셈블리어 코드를 보면 ebp-0x10 주소에 0x08048490 값을 넣고 있다. 이 값은 아래 그림에서 확인해보면 printit 함수의 주소이다. 그리고 fgets 함수를 호출하기 전에 ebp-0x38 주소의 값을 eax 레지스터에 저장하고 있다.

즉, 이 곳이 buf 변수의 시작점이다.

 

 

[사진 3]

앞서 확인했던 printit 함수의 주소를 볼 수 있다.

 

 

[사진 4]

스택 구조는 이전 문제와 동일하게 형성될 것이다. buf 변수부터 &printit 함수 주소 직전까지의 크기는 40bytes이다.

 

 

[사진 5]

먼저 환경변수로 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

 

 

[사진 6]

그리고 위와 같이 임의의 값 "\x90"을 40개 넣어주고 shellcode의 주소를 넣어주면 printit 함수를 호출했던 값이 환경변수에 입력된 shellcode의 주소로 변조된다. 따라서 level18 계정의 쉘이 떨어지고 my-pass 명령어로 level18 계정의 password를 확인할 수 있다.

728x90
728x90