Protostar - Stack 0 (버퍼 오버플로우 공격 + 메모리 참조)

oolongeya

·

2021. 8. 21. 19:51

stack0.c

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
#include <stdlib.h>
#include <unistd.h>
#include <stdio.h>
 
int main(int argc, char **argv)
{
  volatile int modified;
  char buffer[64];
 
  modified = 0;
  gets(buffer);
 
  if(modified != 0) {
      printf("you have changed the 'modified' variable\n");
  } else {
      printf("Try again?\n");
  }
}
cs

 

modified 변수의 값이 0이 아니면 출력되는 값을 목표로 한다.

buffer를 넘치게 채워 modified의 값을 변조를 의도한 문제

 

일반적인 컴파일 명령어

gcc stack0.c -o stack0

 

스택 공격에 취약하도록 컴파일 하는 명령어

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

 

파이썬으로 긴 코드 작성하기 + 프로그램 실행

python -c "print('a'*80)" | ./stack0

 

buffer의 범위를 넘어서 덮어씌우면 modified의 값이 오염당한다.

gdb로 자세하게 알아보자

 

메인 함수는 위와 같다

당연히 메모리 상에서는 ret가 먼저 들어가고, 그 위로 rbp가 쌓인다.

 

메모리는 아래처럼 쌓이는 것이다.

 

그렇다면 사용자 입력을 받는 gets 함수 부분에 브레이크 포인트를 걸어두고

실행 후 입력한 뒤 modified로 의심되는 값을 참조해보려고 한다.

 

소스 코드상에서는 modified가 제일 먼저 선언되기에, 스택에서도 제일 먼저 집어넣었을 것이다.

따라서 [rbp-0x4] 주소 값이 modified로 의심된다. 

또한 main+15 부분에서 0x0 값을 [rbp-0x4]으로 넣어준 것을 보면 알 수 있다.

 

단서는 아래에 또 있다.

 

main+42 부분은 test eax eax 이다.

test A B 는 A 와 B를 AND 연산한 뒤 결과값을 확인하는것이다. 즉 둘이 다른지 아닌지 확인할 수 있는 어셈블리어다.

main+39 부분에서 [rbp-0x4]의 값을 eax로 전달하여. eax의 값이 0인지 아닌지 판별하는 것이다.

이 부분이 소스코드에서는 if 문에 해당한다.

 

buffer에 입력된 a값이 넘쳐 modified 변수또한 aaaa로 덮어진 것을 볼 수 있다.

0x7fffffffdf4c : 0x61616161

 

의심되는 buffer 배열의 첫 메모리 주소를 확인했다. 몇개의 값을 입력해야 modified의 값을 오염할 지를 확인하려한다.

 

16*6 = 96개의 문자를 입력했다. 

0x7fffffffdf40 메모리에서 + 0x00000000000c 니까 12번째가 rbp-0x4이다.
0 1 2 3 4 5 6 7 8 9 A B C (rbp-0x4)

 

16 x 5 = 80 에서 -4를 하면 76이고

77번째가 rbp-0x4 즉 modified의 값으로 추측한다.

 

깔끔하게 modified의 값을 변조했다.

 

의도한 메세지를 modified 값에 넣어보자 77번째 문자부터 modified의 값이니 

a를 67개를 입력하고 ( python -c "print('a'*76)" 입력후 복사해놓으면 편하다 )

마지막에 Hi 를 입력했다

그 후 메모리 값을 살펴보자 69 48이 보인다

아스키코드로 0x69 는 i, 0x48은 H 이다. 리틀엔디안 방식으로 메모리에 들어갔다.

 

소스코드에서 중요하게 다루는 변수나, 리턴주소의 값을 알아내는 것이 중요한 이유는

악의적으로 이 주소값을 변조하여 공격자가 원하는 행위로 유도할 수 있기 때문이다.

 

대표적으로 리턴 주소값을 공격자 공격 코드 주소로 바꾸거나

쉘코드로 권한을 탈취하는 것도 어렵지 않다.

반응형