System hacking/프로토스타(Protostar)

Protostar Stack2 문제

Roronoa 2022. 9. 14. 03:34
반응형

Protostar Stack2

https://exploit.education/protostar/stack-two/

 

Stack Two :: Andrew Griffiths' Exploit Education

Stack Two Stack2 looks at environment variables, and how they can be set. This level is at /opt/protostar/bin/stack2 Source code #include #include #include #include int main(int argc, char **argv) { volatile int modified; char buffer[64]; char *variable; v

exploit.education

위 사이트에 접속을 하면 Stack Two문제의 소스코드를 볼 수 있다.

Source Code

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

}

위의 소스코드를 보면 전과 다르게 getenv라는 녀석이 보인다.

getenv라는 녀석은 환경변수의 값을 읽어오는 함수이다. GREENIE라는 이름을 가진 환경변수를 찾아서 값을 variable에 저장시키는데 만약 GREENIE라는 환경변수가 없으면 NULL을 출력한다.

이 문제는 환경변수에 값을 저장시켜 modified를 우리가 원하는 값으로 변조하면 될것이다.

이번 실습에서는 peda라는 디버거를 사용할 것이다.

 

peda 디버거 설치

https://github.com/longld/peda

 

GitHub - longld/peda: PEDA - Python Exploit Development Assistance for GDB

PEDA - Python Exploit Development Assistance for GDB - GitHub - longld/peda: PEDA - Python Exploit Development Assistance for GDB

github.com

위 사이트에서 peda를 다운받을 수 있다.

[그림 1] peda 설치 방법

설치를 하기 위해서는 Installation에서 코드를 붙여넣으면 된다.

 

[그림 2] peda 설치 완료

그림 1에 있는 코드를 붙여넣어서 설치를 완료하였다.

 

[그림 3] peda 실행

전에 실습한 Stack1을 gdb로 열었더니 gdb-peda라고 뜬다. peda가 잘동작하고 있다는 것이다.

 

문제 풀이

[그림 4] Stack2 컴파일 및 실행

Stack2를 컴파일 하고 실행을 하니 GREENIE라는 환경 변수를 설정하라고 오류메세지가 출력되고 있다.

 

[그림 5] 환경변수 설정 및 실행

환경 변수 GREENIE를 설정을 한 후 Stack2를 실행하니 잘 작동되어 환경변수가 정상적으로 설정 되어있다는 것을 알 수 있다.

 

[그림 6] Stack2 디버깅

peda를 사용하면 set disassembly-flavor intel을 설정안해도 intel방식으로 되어있어서 편리하다.

disas main으로 main함수를 디스어셈블한후 modified값을 비교하는 main+95 번째 위치에 브레이크 포인트를 걸었다.

실행에 앞서 peda의 pattern create에 대해 살펴보겠다.

 

[그림 7] peda pattern creat

pattern create 숫자를 입력하면 숫자만큼 패턴을 만들어낸다. 이 패턴으로 처음부터 얼마나 떨어져있는지 알 수가있어서 자주 사용된다.

pattern offset을 이용하면 처음부터 얼마나 떨어진지 알려준다.

 

[그림 8] 환경변수 재설정

peda로 만들어낸 패턴을 환경변수에 재설정을 한 후 디버깅을 시작하겠다.

 

[그림 9] eax값 확인

Stack2를 디버깅한후 main+95위치에 브레이크 포인트를 넣고 run으로 실행을 하였다. 전과는 다르게 peda를 이용하니 레지스터, 코드, 스택 등 다양한 정보들을 보여줘서 편리하다.

eax값을 확인해보니 0x41413341로 A3AA가 들어있음을 알 수 있다.

 

[그림 10] offset 확인

offset을 확인해보니 68번째 떨어져있음을 알 수 있다.

공격코드를 짜기에 앞서 modified를 0x0d0a0d0a로 설정을 해야하는데 개행문자이므로 제대로 전달이 안될수도 있기 때문에 python을 이용하여 전달하겠다.

 

[그림 11] python으로 공격코드 작성

GREENIE 환경변수에 python으로 짠 공격코드를 넣은 후 Stack2를 실행하면 우리가 modified를 변조하였다고 나온다.

문제를 해결하였다. gdb로 한번 살펴보겠다.

 

[그림 12] RAX값 확인

gdb로 modified값을 비교하는 곳에서 rax 값을 확인해보면 0x0d0a0d0a ('\n\r\n\r')이 잘 들어간것을 알 수 있다.

 

 

결론

오리지널 gdb를 쓰다가 peda를 쓰니 편하다.

 

반응형

'System hacking > 프로토스타(Protostar)' 카테고리의 다른 글

Protostar Stack4 문제  (0) 2022.09.17
Protostar Stack3 문제  (0) 2022.09.16
Protostar Stack1 문제  (2) 2022.09.12
Protostar Stack0 문제  (4) 2022.09.11
Protostar 설치 및 실행  (1) 2022.09.10