FTZ level19 Write-Up

2019. 7. 24. 04:53
728x90
728x90
728x90

FTZ level19 풀어보자.

 

[사진 1]

다시 bof 문제가 나왔다. 그런데 이전 bof 문제들과 다른 점은 setreuid 함수가 없는 것이다. 따라서 setreuid 함수가 포함된 shellcode를 환경변수로 등록하여 ret를 변조하면 된다.

 

 

[사진 2]

먼저 attackme 파일을 /home/level19/tmp/ 디렉터리에 복사한 후 gdb로 main 함수의 어셈블리어 코드를 확인해보자.

gets 함수를 호출하기 전에 ebp-0x28 주소를 eax 레지스터에 저장하는데, 이 곳이 바로 buf 변수의 시작점이다.

 

 

[사진 3]

따라서 스택 구조는 위와 같이 형성된다. buf 변수부터 ebp까지의 크기는 44bytes이다.

 

 

[사진 4]

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

 

 

[사진 5]

그 다음 임의의 값 "\x90"을 44개 입력하여 ebp까지 변조시키고 shellcode의 주소를 입력하면 ret는 변조되어 level20 계정의 권한으로 setreuid 함수를 호출한 후 쉘이 실행될 것이다. 그리고 my-pass 명령어로 level20 계정의 password를 확인할 수 있다.

728x90
728x90

'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

+ Recent posts