security/시스템

Protostar - Stack2

aristia 2020. 9. 22. 19:08

이번에는 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]로 옮기는 것을 확인할 수 있다.