FTZ level12 Write-Up
FTZ level12 풀어보자.
hint를 보면 bof 문제이다. level11과 다른 점은 str 변수에 argv 인자를 저장하는 것이 아니라 gets 함수로 입력을 받는다. 그리고 setreuid 함수로 level13 계정의 권한을 획득하지만 bash 또는 sh 쉘을 실행하지 않으므로 shellcode를 활용해보자.
먼저 attackme 파일을 /home/level12/tmp/ 디렉터리에 복사한다.
그리고 gdb를 통해 attackme 파일을 실행시키면 ebp 레지스터의 값이 바뀌는 것을 알 수 있다.
따라서 환경변수를 사용하여 shellcode를 스택에 저장하고 ret를 shellcode의 주소로 변조하자.
main 함수의 어셈블리어 코드를 보면 gets 함수를 호출하기 전에 ebp-0x108 주소를 eax 레지스터에 저장한다.
즉, ebp-0x108 이 곳이 str 변수의 시작점이다.
따라서 스택은 위와 같이 형성될 것이다. str 변수부터 ebp까지의 크기는 268bytes이다.
위와 같이 gdb를 통해 임의의 값 "\x90"을 268개 넣어주면 ebp까지 "\x90" 값으로 변조된 것을 확인할 수 있다.
r <<< 문자열 형식으로 입력해주면 argv 인자가 아닌 사용자 입력으로 전달된다.
즉, shellcode의 주소를 뒤에 입력해주면 ret는 변조되고 shellcode가 실행될 것이다.
먼저 환경변수로 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
그리고 위와 같이 임의의 값을 268개 입력하고 shellcode의 주소를 입력하면 ret는 변조되어 level13 계정의 권한으로 쉘을 실행할 것이다. 그리고 my-pass 명령어로 level13 계정의 password를 확인할 수 있다.