본문 바로가기
사이버보안/시스템보안

Protostar Stack0

by 개발하는군인 2019. 11. 10.

문제

 

This level introduces the concept that memory can be accessed outside of its allocated region, how the stack variables are laid out, and that modifying outside of the allocated memory can modify program execution.

This level is at /opt/protostar/bin/stack0

 

 

문제 요약

 

프로그램내에서 지역변수들이 스택에 어떻게 저장이 되어지는지

할당된 메모리를 넘어 침범 하면 어떻게 동작하는지 

이상동작으로 어떻게 프로그램 실행을 바꿀수 있는지에 대한 문제입니다! 

 

 

문제 풀이

 

  

제일 먼저 소스코드를 분석 해보겠습니다 

 

앞 1~6번째는 전처리와 메인함수 시작을 정의하는 부분이고 

7번째 줄을 보면 int 형 변수 modified를 선언하면서 "volatile" 이라는 키워드를 붙이는걸 볼수있습니다 

이 "volatile" 키워드는 선언자라고 하며 컴파일시  이변수를 최적화를 통해 임의로 수정하지 못하도록 하는 옵션입니다.

 

 

10~11번째 줄에서 modified에 값을 0으로  그리고 gets() 함수를 사용하여 buffer에 값을 입력 받고있습니다.

13~16번째 줄에서는  modified 값이 0이 아니면  성공 0이면 다시 시도하라고 출력하고있습니다.

 

이 문제를 풀기 위해서는  modified값을 0이 아닌 다른 값으로 변경해야 합니다.

 

 

 

 

대부분의 취약점은 사용자에게 입력을 받는 부분(변하는 부분)에  존재합니다.

 

위에 말을 머리속에 되새기며 다시코드를 보겠습니다.

 

어 !!   아까 값을 입력받는 코드가 있었는데?   

 

"8번째" 줄   gets() 함수를 사용해 프로그램 사용자로 부터 값을 입력받아  buffer에 저장하고 있네?

 

gets 함수는 얼마나 많은 문자를 읽어들일 것인지에 대해 지정하지 않기 때문에  취약하기

 

때문에 우리는 gets함수를 통해서 buffer 값을 변경시킬수 있다는것을 알수있습니다.

 

 

buffer와 modified 변수는 함수내에 선언된 지역변수들이고  이런 지역변수들은  stack에 저장되게 됩니다 .

 

 

buffer  1번째 주소
buffer 
buffer 64번째 주소 
modified 
modified 
modified 
modified 

 

stack 구조는  FILO 구조이다. 그렇기에  위의 표 구조로 값을 저장하게 된다.

 

결국 정답은 

 

buffer가  선언된 크기를 넘어서   modified 영역으로 값을 쓰게된다면 modified 는 0이 아닌 다른수로 바뀌게 된다.

 

 

 

 

 

정답 

 

./stack0 

64byte가 넘는 문자열을 입력하면 성공! 

 

 

 

 

'사이버보안 > 시스템보안' 카테고리의 다른 글

Protostar Stack3  (0) 2020.03.22
Protostar Stack2  (0) 2020.03.19
Protostar Stack1  (0) 2020.03.15
시스템보안 1일차 - 윈도우보안  (0) 2020.03.15