FTZ level9 풀이
FTZ level9 풀이
level9의 홈디렉토리의 파일내용은 이렇다.
hint의 파일내용을 확인해보자
hint 파일내용에는 c언어 소스코드가 있다.
소스코드를 해석해보자.
소스코드를 보면 buf2 배열의 값에 go 문자열이 있으면 level10의 권한으로 /bin/bash 셸이 실행된다. 하지만 buf2 변수는 우리가 임의로 값을 입력할 수 없다. 그렇다면 어떻게 buf2 변수에 go문자열을 넣을수 있을까?
현재 이 소스코드에는 문제점이 있다. 바로 buf 변수의 크기는 10바이트로 할당했는데 fgets로 buf 변수에 입력받는 값은 40바이트 이다. 이렇게 되면 buf에 10바이트 이상의 값이 입력되면 buf 변수의 버퍼영역이 buf2 변수의 버퍼영역을 침범하게 되어 버퍼 오버 플로우 취약점이 발생한다.
조금 더 쉽게 이해하기 위해 hint 파일의 소스코드를 복사해 컴파일 한후 gdb를 통해 어샘블리어 코드로 접근해보자.
level9gdb 라는 이름으로 컴파일했다.
어샘블리어로 확인해보면 [ebp-40] 에 문자열을 입력받는다. 그리고 [ebp-24] 에서 문자열을 비교한다.
쉽게말해 [ebp-40]은 buf 변수의 위치이며, [ebp-24]는 buf2 변수의 위치가 될 것이다.
그래서 buf와 buf2 사이의 거리는 16바이트이며, 원래 변수에 할당된 10바이트 만큼의 거리 차이가 있어야 하는데 dummy라는 쓰레기 값이 6바이트 만큼 존재해 16바이트 만큼 차이나게 되는 것이다.
buf의 변수에 값을 16바이트 만큼 넣은후 그뒤에 go를 넣게되면 buf의 주소와 쓰레기값을 지나 buf2의 주소를 덮어 씌워 셸이 실행될 것이다.
buf[10] + dummy[6] + buf2[10]
XXXXXXXXXX XXXXXX go
파이썬으로 X를 16번 입력하고 마지막에 go 문자를 연결한뒤 |(파이프)를 이용해 /usr/bin/bof 파일을 cat으로 출력시켰다.
그랬더니 /bin/bash 셸이 실행되었고 my-pass 명령으로 level10의 패스워드가 출력됬다.
level9 clear ~
'System Hacking > FTZ' 카테고리의 다른 글
FTZ level11 풀이 (0) | 2017.07.04 |
---|---|
FTZ level10 풀이 (0) | 2017.06.30 |
FTZ level8 풀이 (0) | 2017.06.30 |
FTZ level7 풀이 (0) | 2017.06.30 |
FTZ level6 풀이 (0) | 2017.06.30 |