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

oolongeya

·

2021. 8. 22. 20:29

stack2.c
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
#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);
  }
 
}
cs

 

기존 문제와 큰 차이가 없지만 중간에 getenv("GREEINE") 부분이 환경변수를 불러오는 부분이 새로 생겼다.

 

GREENIE 환경 변수를 받는 변수 variable의 값을 채우면서 modified의 값을 0x0d0a0d0a로 덮어씌우면 해결이다.

 

export 환경변수명 = '설정 경로' 명령어로 추가해준뒤 실행했더니, 위와 같이 나왔다.

 

소스코드 대로 함수들이 있고 strcpy 함수 부분은 [rbp-0xc] 값을 eax에 옮기는 것을 확인할 수 있다.

 

패턴 기능을 사용하기 위해 gdb - peda 를 다운로드 하겠다.

이런 간단한 워게임 문제들은 프로그램의 구조상 메모리의 위치 차이가 크지 않지만,

실제 프로그램은 훨씬 복잡하고 다양한 값들이 채워져 있기때문에, 실전에서 메모리 주소를 빼고 계산하고 유추하는 것이 쉬운 일이 아니다.

 

그래서 peda의 패턴 기능을 이용하려고 한다.

패턴을 만들고 몇 번째에 있는지 알아낼 수 있다.

 

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

 

그리고 패턴을 환경변수 GREENIE에 설정한다.

 

그리고 gdb에서 modified의 값과 비교하는 조건문 부분에 브레이크 포인트를 걸어둔다.

 

다양한 정보를 확인할 수 있는데, eax와 비교하기 때문에 eax 값을 확인하면 된다.

eax의 값은 현재 A3AA 이다.

 

68바이트 만큼 떨어진 것을 확인할 수 있다.

 

리틀 엔디안 방식으로 작성하는 거 잊지말자

 

참고로 0a0d0a0d는 개행 문자, 아스키코드로 키보드 enter를 의미한다.

키보드 입력값으로 해당 값을 넣기는 쉽지 않을 것이다.

반응형