본문으로 바로가기

[Protostar] Stack2 풀이, write-up

category Wargame/Protostar 2019. 1. 7. 10:01

Protostar --- Stack2



Stack2의 힌트이다.



Stack2 looks at environment variables, and how they can be set.



힌트를 해석해보자면 아래와 같다.


Stack2는 환경변수를 사용한다. 어떻게 환경변수가 사용되는지 확인해봐라.



Stack2.c의 소스는 다음과 같다.



1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
#include <stdlib.h>
#include <unistd.h>
#include <stdio.h>
#include <string.h>
 
int main(int argc, char **argv)
{
  volatile int modified;
  char buffer[64];
  char *variable;
 
  variable = getenv("GREENIE");
 
  if(variable == NULL) {
      errx(1"please set the GREENIE environment variable\n");                    
  }
 
  modified = 0;
 
  strcpy(buffer, variable);
 
  if(modified == 0x0d0a0d0a) {
      printf("you have correctly modified the variable\n");
  } else {
      printf("Try again, you got 0x%08x\n", modified);
  }
 
}
cs



volatile keyword를 사용하여 int type modified를 선언한다.

char type array 64 byte buffer를 할당한다. char * type 8 byte(64bit)를 선언한다.



1
2
3
4
5
int main(int argc, char **argv)                                                    
{
  volatile int modified;
  char buffer[64];
  char *variable;
cs



getenv() 함수를 사용하여 "GREENIE" 환경변수의 주소를 variable에 return 한다. "GREENIE"의 이름을 가진 환경변수가 없다면, return NULL이다.

만일 variable의 주소가 NULL이면 (즉, GREENIE의 환경변수가 set되지 않으면) "please set the GREENIE enviroment variable\n" error message를 출력한다.



1
2
3
4
5
  variable = getenv("GREENIE");
 
  if(variable == NULL) {
      errx(1"please set the GREENIE environment variable\n");                    
  }
cs



modified 변수를 0으로 초기화 하고 variable(GREENIE)의 내용(String)을 buffer로 copy한다. 



1
2
3
  modified = 0;
 
  strcpy(buffer, variable);                                                        
cs



만일 modified의 값이 "0x0d0a0d0a"이면, "you have correctly modified the variable\n"을 출력한다.

만일 modified의 값이 "0x0d0a0d0a"가 아니면, "Try again, you got modified\n"를 출력한다.



처음 terminal을 열면 GREENIE의 환경변수가 set되지 않았으므로, stack2 실행에 실패할 것이다.





환경변수를 set 하는 방법은 아래와 같다.


export [환경변수명] = "설정 경로"


우리가 목표로 하는것은 환경변수를 이용해 overflow를 통한 modified 변조이다.

따라서 GREENIE 환경변수에 80 byte의 A로 패딩을 진행한다.

echo $[환경변수명]을 이용해 환경변수의 내용을 확인가능하다.





하지만 실행을 해보면 stack 구조를 분석하지 않았기 때문에 아래와 같이 환경변수 유무는 통과 가능하지만 원하는 String은 얻을 수 없다.





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





variable과 buffer, modified가 stack의 어느 위치에 존재하고 dummy가 얼만큼 있는지 확인하면 된다.


stack2 elf의 stack 구조는 아래와 같다.





char *variable 변수는 맨 마지막에 선언된 지역 변수이므로 buffer[64] 위에 선언되어서 사용되어야 하지만 어찌된 일인지 QWORD PTR [rbp-0x8]을 통해 접근한다.





다음과 같이 rax에 GREENIE의 환경변수의 주소가 들어있고 QWORD PTR [rbp-0X8]로 옮기는 것을 확인할 수 있다.


stack 구조를 바탕으로 미루어 보아 GREENIE에 68 byte padding을 통해 modified의 변수에 접근하고 추가 4 byte를 통해 modified를 변경할 수 있다.


little endian 방식을 사용함을 미루어 봐아 아래와 같이 성공할 수 있다.




굳!



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

[Protostar] Stack5 풀이, write-up  (0) 2019.01.12
[Protostar] Stack4 풀이, write-up  (0) 2019.01.09
[Protostar] Stack3 풀이, write-up  (1) 2019.01.08
[Protostar] Stack1 풀이, write-up  (0) 2019.01.06
[Protostar] Stack0 풀이, write-up  (0) 2019.01.05