이제는 hint를 출력하면 설명이 없이 소스코드를 출력한다. 아마 폴더에 같이 있던 attackme의 소스코드일 것으로 판단한다.
이번에는 3092번으로 uid를 설정한다. 확인해보면 level12의 uid인 것을 확인할 수 있다.
코드는 간단하게 프로그램 실행할 동시 parameter를 받고, 그 첫번째 값을 str에 저장하고, 출력한다. uid는 level12의 것으로 바뀌지만, 그외에 명령을 실행할 수 있는 방법이 없다. 인자값에 쉘코드를 박아, printf를 리턴할 때 쉘코드로 넘어가 쉘을 올리면 level12의 권한을 가진 쉘을 실행할 수 있다.
argv[1]의 값을 str에 저장하기 때문에, argv[1]에 쉘코드를 입력하여 놉슬레드를 태워 ret까지 넘기는 방법이 존재하는데 스택의 주소가 실행할 때마다 변경되기도 하고, 이상하게 nop sled를 넉넉하게 태워도 segment error가 발생하여 비교적 위치가 안정적인 argv[2]에 쉘코드를 저장해놓고, ret에 argv2의 주소를 넣기로 했다.
이때 argv[2]의 주소를 얻는게 관건이었다.
main+43은 *argv의 주소를 확인할 수 있는데, 문제는 ebp-12는 argv 배열의 주소의 포인터이다. 그래서 이 주소를 들어가면 비로소 argv 배열의 주소를 알 수 있다.
다음과 같이 argv[1]의 주소를 확인할 수 있다. 같은 방법으로, argv[2]의 주소를 확인해보자.
argv[2]의 주소가 전의 실행과 크게 바뀌지 않는 것을 확인할 수 있다. 해당 주소를 이용하여 쉘코드로 익스플로잇을 진행해보자.
쉘코드는 간단하게 세 부분으로 나뉘어져 있다.
1. nop sled로 str부분과 더미, sfp를 채우고
2. ret에 넣을 이 쉘코드의 첫 메모리 위치 = argv[2]의 위치를 넣고
3. argv 구분용 공백
4. nop sled
5. 쉘코드 (실질적 argv[2])
실행하면 다음과 같이 익스플로잇을 할 수 있다.
다시 실행을 해본 결과 세그먼트 폴트가 계속하여 뜨는 것을 확인할 수 있었다. argv는 어느정도는 일정하게 유지되지만 변경되는 값이기 때문에 확실하게 환경변수를 이용하여 익스플로잇을 진행하는 것이 좋다고 생각했다.
'Write-Up > FTZ' 카테고리의 다른 글
FTZ: Level17 (0) | 2019.11.20 |
---|---|
FTZ: Level15 (0) | 2019.11.20 |
FTZ: Level 10 - writeup 수정중 (해결완료) (0) | 2019.11.12 |
FTZ: Level 9 (0) | 2019.11.12 |
FTZ: Level 8 (0) | 2019.09.26 |