Protostar stack-2

2023. 2. 1. 13:31Pwnable/프로토스타_시스템해킹

먼저 문제 소스코드는 다음과 같다.

 

#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);
  }

}

 

이 문제 또한 Buffer Over Flow 공격을 하여 modified 의 값을 = 0x0d0a0d0a 로 변경해야 한다.

 

Getenv 함수를 통해 "GREENIE"  라는 환경변수로 variable 값을 넣는다.

 

문제를 풀때 즉 환경변수 GREENIE 값을 어떻게 넣는냐에 따라 결과를 출려할 수 있을 것이다.

// if variable == Null 일떄 문제는 실패하기에 별도로 값을 넣어야 한다.

 

 

먼저 GDB를 통해 스택 구조를 파악해봐야 한다.

 

 

필자가 사용하는 gdb 인 peda 에서는 pattern을 지원한다.

 

//패턴을 생성하여 값을 넣어주면 스스로 레지스터 혹은 변수 등의 거 리를 측정하여 출력합니다. 다음 명령어를 사용해 패턴을 생성합니다. 이 패턴은 4바이트 기준으로 같은 값이 나오지 않도록 패턴을 생성합 니다.

 

pattern 을 통해 변수간의 거리를 계산할 수 있을 것이다.

 

modified 변수에 값을 지정하고 이후 if 문을 통해 값을 확인하는데 해당 어셈블리어 구간은 

 

main+84 로 있다.

 

먼저 중단점을 지정하고 실행시켜보자. ( 패턴 생성후 )

 

--> 생성된 pattern

 

이 패턴을 pattern 환경변수에 넣고 실행한다.

 

 

 

비교하는 EAX 값에 AAdA 라는 값을 확인할 수 있으며

 

pattern offet AAda 를 통해 거리를 확인할 수 있다.

 

offset 이 64 이므로 

 

즉 문자열 'A' * 64를 넣고 그다음 modified 값을 0x0d0a0d0a 로 넣으면 된다.

 

메모리에서 데이터를 받아올때 리틀엔디언 방식으로 받아오므로 

 

환경변수 GREENIE 를 파이썬을 통해 넣으면 된다.

 

명령어는

 

export GREENIE=$(python2 -c 'print "A"*64 + "\x0a\x0d"*2')

 

를 통해 환경변수를 지정하고 실행을 시키면

 

 

변경하여 정답을 나타내는 문자열이 출력된다.

 

성공 !