Write-Up/FTZ

FTZ: Level11

NONE_31D 2019. 11. 13. 02:34

이제는 hint를 출력하면 설명이 없이 소스코드를 출력한다. 아마 폴더에 같이 있던 attackme의 소스코드일 것으로 판단한다.

이번에는 3092번으로 uid를 설정한다. 확인해보면 level12의 uid인 것을 확인할 수 있다. 

 

코드는 간단하게 프로그램 실행할 동시 parameter를 받고, 그 첫번째 값을 str에 저장하고, 출력한다. uid는 level12의 것으로 바뀌지만, 그외에 명령을 실행할 수 있는 방법이 없다. 인자값에 쉘코드를 박아, printf를 리턴할 때 쉘코드로 넘어가 쉘을 올리면 level12의 권한을 가진 쉘을 실행할 수 있다.

 

attackme.c 어셈블리 코드

 

argv[1]의 값을 str에 저장하기 때문에, argv[1]에 쉘코드를 입력하여 놉슬레드를 태워 ret까지 넘기는 방법이 존재하는데 스택의 주소가 실행할 때마다 변경되기도 하고, 이상하게 nop sled를 넉넉하게 태워도 segment error가 발생하여 비교적 위치가 안정적인 argv[2]에 쉘코드를 저장해놓고, ret에 argv2의 주소를 넣기로 했다.

 

이때 argv[2]의 주소를 얻는게 관건이었다. 

main+43은 *argv의  주소를 확인할 수 있는데, 문제는 ebp-12는 argv 배열의 주소의 포인터이다. 그래서 이 주소를 들어가면 비로소 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