문제
his level looks at the concept of modifying variables to specific values in the program, and how the variables are laid out in memory.
This level is at /opt/protostar/bin/stack1
문제요약
프로그램 내에서 변수들이 어떻게 배치되는지 학습하고
변수를 특정 값으로 수정할수 있는지 확인하는 문제입니다!
문제풀이
제일 먼저 소스코드를 분석하겠습니다 .
8~9 번째 volatile int modified 변수와 char형 배열 64byte를 선언하고 있습니다
* volatile 설명 -> https://ktn1075.tistory.com/2
Protostar Stack0
문제 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 modif..
ktn1075.tistory.com
11~12 번째 줄은 프로그램 실행시 매개변수를 받았는지 확인하고 입력하지 않았다면
에러 메시지를 출력 하고있습니다 .
15~16번째 줄은 modified를 0으로 초기화하고 buffer에 "입력한 매개변수" 를 복사하고있습니다.
18~21번째 줄은 modified 값이 "0x61626364" 인지 아니지 확인하고 만약 맞다면 성공 틀렸다면 실패 입니다.
이 문제를 풀기 위해서는 modified 값을 "0x61626364" 값으로 변경해야 합니다
stack0 문제에서도 말했듯이 대부분의 취약점은 사용자에게 입력을 받는 부분 , 변하는 부분에 존재합니다.
프로그램 실행시 Main 함수에서 입력값을 받고 있으며 받은 입력값을 strcpy() 함수를 사용하여
값을 buffer에 복사 하지만 strcpy() 함수는 값을 복사할때 몇 byte를 복사할것 인지에 대한 지정이 없어
버퍼오버플로우가 발생할수 있습니다.
0번 문제와 똑같이 buffer와 modified 변수는 지역변수이며 stack 저장되게 됩니다.
64byte의 값을 넘게 입력하면 modified 영역까지 침범하는 버퍼오버플로우가 발생합니다 .
0번 문제는 여기까지가 끝이 였지만 1번문제는 더나아가 modified 값을 "0x61626364" 로 변경해야 합니다.
"0x61626364" 값 시작이 0x로 시작되어 16진수라는것을 알수있습니다.
ex) 00은 8진수
"0x61626364" 에 저장된 값은 아스키코드표를 abcd 라는 값을 알수있고 C언어는 리틀엔디만 방식으로
값을 처리하므로 64byte + dcba값을 입력하면 modified 변수값을 "0x61626364" 로 변경할수있습니다.
'사이버보안 > 시스템보안' 카테고리의 다른 글
Protostar Stack3 (0) | 2020.03.22 |
---|---|
Protostar Stack2 (0) | 2020.03.19 |
시스템보안 1일차 - 윈도우보안 (0) | 2020.03.15 |
Protostar Stack0 (0) | 2019.11.10 |