본문 바로가기

FTZ. System Hacking

level9 - 오버플로우(overflow)

문제

# 취약점은 fgets 명령어에서 발생한다. buf는 10바이트가 할당 됐지만, 입력값은 40바이트를 받고있다. 따라서 오버플로우를 발생시켜 buf2의 메모리를 조작할 수 있고 level10의 권한을 얻을 수 있다.

 

 

# 먼저 아무 계산하지않고 go를 무작정 입력해 보자, Good Skill과 함께 레벨 10의 권한을 얻었다.

 

 


 

이번 level에서 중요하게 알아야 할 것은 buf에 10바이트의 배열을 선언 했다고해서 메모리상에도 10바이트가 그대로 적용되지는 않는다는 것이다.

컴퓨터는 기본 원칙이 있고, 운영체제와 컴파일러마다 최고의 성능을 낼 수 있도록 기본 원칙을 어기지 않는 범위 안에서 약간의 변형을 가한다.

 

10 

10 

buf[10] 

dummy 

buf2[10] 

dummy 

SFP 

RET 

<--- 낮은 메모리 주소(스택 증가 방향)

따라서, buf의 메모리 구조는 다음과같이 돼있다.

 

이제 정확한 해결 방법이 보인다. 이번 level은 특정 값을 원하는 메모리에 쓸 수 있는것인가가 핵심인 것이다.

# buf[10]과 dummy[6]을 A로 채우고 나머지는 오버플로우로 go를 입력해주면 buf2에 go라는 문자열이 입력되고 level10의 권한을 얻을 수 있는 것이다.

 

현재 실행 중인 함수의 실행이 종료되면 리턴 주소(RET)에 있는 주소를 찾아가서 다음 코드를 실행하게 된다. 그러므로 리턴 주소를 우리가 원하는 실행 코드가 들어 있는 주소로 바꾸면 우리가 원하는 코드를 실행하게 할 수 있다. 즉, 프로그램의 흐름을 바꾸는 것이다.

 

 

※ 파이썬 스크립트를 이용한 문자열 입력

이번 레벨에서는 오버플로우를 이용하기위해서 입력할 문자열은 20바이트도 안됐지만, 앞으로의 문자열입력은 몇배가 될지 모른다. 따라서 스크립트를 이용해서 문자열을 입력하는 연습이 필요하다.