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

oolongeya

·

2021. 8. 21. 20:05

Stack1.c
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
#include <stdlib.h>
#include <unistd.h>
#include <stdio.h>
#include <string.h>
 
int main(int argc, char **argv)
{
  volatile int modified;
  char buffer[64];
 
  if(argc == 1) {
      errx(1"please specify an argument\n");
  }
 
  modified = 0;
  strcpy(buffer, argv[1]);
 
  if(modified == 0x61626364) {
      printf("you have correctly got the variable to the right value\n");
  } else {
      printf("Try again, you got 0x%08x\n", modified);
  }
}
cs

 

Protostar - Stack 1의 문제와 별 다른점이 없는 소스코드이다.

 

단 modified, buffer 선언 후 if(argc == 1) 조건문이 추가되었다. 

즉 ./stack1을 통해 실행을 하고 끝나는게 아니라 ./stack1 1234 처럼 인자값을 추가해야 한다는 것이다.

 

입력받은 인자값을 buffer 배열에 복사하는 것을 확인할 수 있다

strcpy(buffer, argv[1]) 

 

마지막 조건문은 modified의 값이 0x61626364인지 확인한다.

Protostar에선 리틀엔디안 방식이니 dcba로 입력해야겠다.

 

인자를 확인하는 조건문이 있었던 것 처럼 입력하지 않으면 종료된다.

또한 you got 0x00000000을 통해 친절하게 메모리 부분을 보여준다.

 

를 통해서 rbp-0x4를 덮어씌우면 됨을 바로 알아낼 수 있다.

 

python -c "print('a'*76)" 으로 복사한뒤 마지막에 dcba만 추가해주겠다.

 

이전 stack.0을 확실하게 이해했다면, stack.1은 stack0과 같은 문제에서 공부한 것과 같다.

반응형