Protostar - Stack2
이번에는 Stack2번 문제를 풀어볼 것이다.
Stack2번 문제는 아래 사이트에서 확인할 수 있다.
========================================================
Stack2 looks at environment variables, and how they can be set.
This level is at /opt/protostar/bin/stack2
이걸 해석해보면
Stack2는 환경변수와 환경변수를 어떻게 설정할 수 있는지 살펴본다.
========================================================
1. 문제 확인

이번에도 modified랑 buffer을 선언한 것을 확인할 수 있다.
variable = getenv("GREENIE");
이것에서 GREENIE라는 환경변수 주소를 variable에 리턴해주었다.
if(variable == NULL) {
errx(1, "please set the GREENIE environment variable\n"); }
여기서 variable이 null값이면
즉, GREENIE의 환경변수가 variable에 없으면
에러가 나오게 한다.
modified = 0;
strcpy(buffer, variable);
modified를 0으로 채워주고,
variable을 buffer로 복사해준다.
저번에도 말했듯이 strcpy는 버퍼오버플로우가 잘 되는 함수이기도 했다.
if(modified == 0x0d0a0d0a) {
printf("you have correctly modified the variable\n"); }
else {
printf("Try again, you got 0x%08x\n", modified); }
여기서 modified가 0x0d0a0d0a를 찾는 것이 핵심일 것 같다.
========================================================
2. 문제 풀이
환경변수를 세팅하는 방법은 다음과 같다.
export 환경변수

여기서 export GREENIE를 하고 test를 넣어줬다.
하지만 echo를 했을 때 출력되지 않음을 확인할 수 있다.

그래서 구조를 알기 위해서 gdb를 분석해보기로 한다.

여기서 찾고자 하는 0x0d0a0d0a를 확인할 수 있다.
char *variable;은 맨 마지막에 선언된 변수이므로
buffer 위에 선언되어 있어야 한다.
DWORD PTR [esp+0x5c],eax
eax의 GREENIE의 환경변수가 있고,
이를 DWORD PTR [esp+0x5c]로 옮기는 것을 확인할 수 있다.
