관리 메뉴

Information Security

Stack 2 본문

WarGame/Protostar

Stack 2

HackingPractice 2020. 9. 23. 15:26

volatile keyword를 사용하여 int type modified를 선언한다. char type array 64 byte buffer를 할당한다. 그리고 환경변수를 사용한다. getenv() 함수를 사용하여 "GREENIE" 환경변수의 주소를 variable에 return을 하며 "GREENIE"의 이름을 가진 환경변수가 없다면, return NULL 값을 반환한다. 만일 variable의 주소가 NULL이면 (즉, GREENIE의 환경변수가 set 되지 않으면) "please set the GREENIE environment variable" error message를 출력한다.

그림 2-1 문제

modified 변수를 0으로 초기화 하고 variable(GREENIE)의 내용(String)을 buffer로 copy 한다. 만일 modified의 값이 "0x0d0a0d0a"이면, "you have correctly modified the variable"을 출력한다. 만일 modified의 값이 "0x0d0a0d0a"가 아니면, "Try again, you got modified\n"를 출력한다.

 

 

GREENIE 환경변수에 "A" * 20을 설정 후 실행시키면 "Try again" 메시지를 보여준다.

그림 2-2 환경변수

stack 구조를 분석하기 위해 gdb를 통해 분석해보았다.

그림 2-3 gdb

RAX에 GREENINE의 환견변수의 주소가 들어가 있고, QWORD PTR [rbp-0x80]로 옮기는 것을 알 수 있다. GREENINE에 68 byte padding을 통해 modified의 변수에 접근하고 추가 4 byte를 통해 modified를 변경할 수 있다.

그림 2-4 stack 구조

A * 68개를 환경변수에 넣어 실행하니 buffer 64byte가 오버플로우가 일어나 modified변수에 "AAAA"값이 들어갔다. 환경변수에 리틀 엔디언 방식으로 0x0d0a0d0a를 넣어주면 "you have correctly modified the variable"문자가 출력되는 것을 알 수 있다.

그림 2-5 정답

'WarGame > Protostar' 카테고리의 다른 글

Stack 4  (0) 2020.09.23
Stack 3  (0) 2020.09.23
Stack 1  (0) 2020.08.31
Stack 0  (0) 2020.08.31
Peda 설치  (0) 2020.08.08