System hacking/프로토스타(Protostar)

Protostar Stack1 문제

Roronoa 2022. 9. 12. 01:46
반응형

1. Protostar Stack1

https://exploit.education/protostar/stack-one/

 

Stack One :: Andrew Griffiths' Exploit Education

Stack One This level looks at the concept of modifying variables to specific values in the program, and how the variables are laid out in memory. This level is at /opt/protostar/bin/stack1 Hints If you are unfamiliar with the hexadecimal being displayed,

exploit.education

위 사이트에 접속을 하면 Stack one문제의 소스코드를 볼 수 있다.

Source Code

#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);
  }
}

위의 소스코드를 보면 변수 modified와 buffer 배열이 선언되어 있다.

modified의 값은 0으로 초기화 되어있고 strcpy를 통하여 argv[1]의 매개변수를 buffer에 저장한다. 여기에서 strcpy함수는 길이를 지정해주지 않기 때문에 버퍼오버플로우를 일으킬 수 있다.

만약 modified가 0x61626364로 변조될경우 우리가 원하는 값을 도출할 수 있을 것이다.

 

[그림 1] Stack1 실행

Stack1의 파일을 만든 후 스택영역 바이너리 실행권한을 주었고 메모리가 랜덤하게 되지 않도록 컴파일 하였다.

Stack1을 그냥 실행하니 argument를 넣어달라고 한다. 매개변수 값으로 1234를 넣으니 modified의 16진수 값이 0000으로 나왔다. 변환이 되지 않은것이다. 그래서 입력 값을 크게 하여 매개변수에 값으로 넣었더니 modified의 값이 0x61616161로 a문자들로 변조가 된것을 확인할 수 있다.

정답을 도출하기 위해서 modified의 값을 0x61626364로 바꿔야 한다. 일단 gdb를 이용하여 디버깅 해보겠다.

 

[그림 2] Stack1 디버깅

그림 2는 Stack1을 디스어셈블한 결과이다.

main+15 위치에 cmp라고 비교를 하는 함수가 있는데 rbp-0x54 위치와 0x1과 비교를 한다. 이 부분은 매개변수가 1개인지 아닌지 검사하는 부분인것 같다.

modified의 위치는 main+82번째 위치에 0x61626364와 비교를 하고 있는 eax가 modified이고 rbp -0x4 위치 인것을 쉽게 찾을 수 있다.

매개변수의 값들이 저장되는 위치는 strcpy 함수위를 보면 rsi와 rdi를 설정하는 것을 볼 수 있다.

rsi는 메모리를 이동하거나 비교할 때 출발주소을 가리키는데 사용하고, rdi는 메모리를 이동하거나 비교할 때 목적지 주소를 가리키는데 사용한다. 따라서 rdi의 값이 buffer배열이라는 것을 알 수있다. rdi는 rax이고 rax는 rbp-0x50 위치라는 것을 알수있다.

 

[그림 3] 입력값 A*76 B*4개 입력

매개변수에 A를 76개넣고 B를 4개넣어서 실행을 하였더니 modified부분에 0x42인 B가 들어와있음을 알 수 있다.

우리는 modified에 0x61626364를 넣어야 한다. 하지만 리틀엔디언 방식이므로 \x64\x63\x62\x61처럼 넣어야 한다.

즉 아무값이나 76개를 넣고 dcba를 뒤에 넣으면 우리가 원하는 값을 출력할 수 있을것이다.

 

[그림 4] 결과 값 출력

쓰레기 값으로 76바이트를 채우고 나머지를 dcba를 채우니 우리가 원하는 값을 출력에 성공하였다.

결론 : 길이를 검사하지 않는 strcpy함수를 쓰지말고 strcpy_s를 써라!!

반응형

'System hacking > 프로토스타(Protostar)' 카테고리의 다른 글

Protostar Stack4 문제  (0) 2022.09.17
Protostar Stack3 문제  (0) 2022.09.16
Protostar Stack2 문제  (2) 2022.09.14
Protostar Stack0 문제  (4) 2022.09.11
Protostar 설치 및 실행  (1) 2022.09.10