문제
# 취약점은 fgets 명령어에서 발생한다. buf는 10바이트가 할당 됐지만, 입력값은 40바이트를 받고있다. 따라서 오버플로우를 발생시켜 buf2의 메모리를 조작할 수 있고 level10의 권한을 얻을 수 있다.
# 먼저 아무 계산하지않고 go를 무작정 입력해 보자, Good Skill과 함께 레벨 10의 권한을 얻었다.
이번 level에서 중요하게 알아야 할 것은 buf에 10바이트의 배열을 선언 했다고해서 메모리상에도 10바이트가 그대로 적용되지는 않는다는 것이다.
컴퓨터는 기본 원칙이 있고, 운영체제와 컴파일러마다 최고의 성능을 낼 수 있도록 기본 원칙을 어기지 않는 범위 안에서 약간의 변형을 가한다.
10 |
6 |
10 |
6 |
4 |
4 |
buf[10] |
dummy |
buf2[10] |
dummy |
SFP |
RET |
<--- 낮은 메모리 주소(스택 증가 방향)
따라서, buf의 메모리 구조는 다음과같이 돼있다.
이제 정확한 해결 방법이 보인다. 이번 level은 특정 값을 원하는 메모리에 쓸 수 있는것인가가 핵심인 것이다.
# buf[10]과 dummy[6]을 A로 채우고 나머지는 오버플로우로 go를 입력해주면 buf2에 go라는 문자열이 입력되고 level10의 권한을 얻을 수 있는 것이다.
현재 실행 중인 함수의 실행이 종료되면 리턴 주소(RET)에 있는 주소를 찾아가서 다음 코드를 실행하게 된다. 그러므로 리턴 주소를 우리가 원하는 실행 코드가 들어 있는 주소로 바꾸면 우리가 원하는 코드를 실행하게 할 수 있다. 즉, 프로그램의 흐름을 바꾸는 것이다.
※ 파이썬 스크립트를 이용한 문자열 입력
이번 레벨에서는 오버플로우를 이용하기위해서 입력할 문자열은 20바이트도 안됐지만, 앞으로의 문자열입력은 몇배가 될지 모른다. 따라서 스크립트를 이용해서 문자열을 입력하는 연습이 필요하다.
'FTZ. System Hacking' 카테고리의 다른 글
level8 - find 명령어, 패스워드 파일 크랙 (0) | 2017.12.31 |
---|---|
level7 - 2진수, 10진수, 아스키코드 (0) | 2017.12.29 |
level6 - 시그널 (0) | 2017.12.29 |
level5 - 레이스 컨디션(Race Condition) (1) | 2017.12.22 |
level4 - system()함수의 위험성 (0) | 2017.11.29 |