System hacking/프로토스타(Protostar)

Protostar Stack3 문제

Roronoa 2022. 9. 16. 18:39
반응형

Protostar Stack3

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

 

Stack Three :: Andrew Griffiths' Exploit Education

Stack Three Stack3 looks at environment variables, and how they can be set, and overwriting function pointers stored on the stack (as a prelude to overwriting the saved EIP) Hints both gdb and objdump is your friend you determining where the win() function

exploit.education

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

Source Code

#include <stdlib.h>
#include <unistd.h>
#include <stdio.h>
#include <string.h>

void win()
{
  printf("code flow successfully changed\n");
}

int main(int argc, char **argv)
{
  volatile int (*fp)();
  char buffer[64];

  fp = 0;

  gets(buffer);

  if(fp) {
      printf("calling function pointer, jumping to 0x%08x\n", fp);
      fp();
  }
}

이번 문제는 win이라는 함수가 있고 fp를 변조하여 win함수가 실행되도록 하는 문제이다.

main함수에서 int (*fp)();로 함수 포인터가 선언되어 있다. 함수 포인터란 함수의 주소를 가리키는 포인터로 함수를 호출할때 사용한다.

fp가 0을 가리키고 있으면 0번째 주소를 가리키는 것이며 fp를 변조하여 win함수의 시작주소를 넣으면 fp()함수가 실행될 경우 win함수가 실행 될 것이다. 바로 문제를 풀어 보겠다.

문제 풀이

[그림 1] Stack3 실행

Stack3을 실행한 뒤 a를 조금 넣으니 아무런 출력도 없다.

a를 100개 생성한 뒤 Stack3에 넣으니 0x616161로 점프를 하였다는 것을 알 수있다. 그리고 0x616161을 실행할 수 없으니 segment 오류가 난것을 알 수 있다. 우리는 문제를 위해서 fp부분의 win의 시작주소를 넣어야 win함수를 실행할 수 있을것이다.

 

[그림 2] win 함수 시작 주소

info functions을 통하여 함수를 볼 수 있고 왼쪽에 주소들도 볼 수 있다. 다른 방법으로 함수의 이름을 알 경우 disas win을 통하여서도 함수의 시작주소를 알 수있다.

win의 시작주소는 0x0000000000401146이다.

 

[그림 3] disas main 화면

main함수를 보면 main+35 부분에서 gets로 문자들을 입력받고 main+40 위치에서 rbp-8부분과 0이랑 비교를한다. 이 부분이 fp가 0인지 아닌지 비교하는 구문인것 같고 main+83번째 위치에 call rdx를 실행하는데 이 부분은 fp함수를 실행하는 부분일 것이라고 예상된다. 먼저 main+40부분에 브레이크 포인터를 걸어서 한번 실행하도록 하겠다.

 

[그림 4] main+40 부근 확인

먼저 pattern create 100으로 패턴이있는 문자열을 생성한 후 값을 입력하여 주었다.

값을 입력한 후 run을 실행하니 main+40부분에 잘 도착한 것을 볼 수 있다.

rbp -8 부분과 0을 비교하고 있으므로 rbp -8에 무슨 값이 들어있는지 확인하여야 한다.

 

[그림 5] offset 확인

rbp -8 부분을 확인 하니 0x4134414165414149이라는 값이 들어 있다.

pattern offset으로 확인을 해보니 72번째 떨어져 있다고 한다. 72번째 떨어진 위치로부터 fp함수가 변조가 된다는 것을 알 수있다. 우리는 72번째 뒤에 win의 시작주소를 넣으면 win을 실행할 수 있을 것이다.

 

[그림 6] pwntools 을 사용하여 payload 작성

pwntools을 사용하여 payload를 작성한 후 전송하도록 하겠다.

 

[그림 7] Stack3 win함수 우회 성공

python으로 payload를 작성한 파일을 실행하였다.

그 결과 jump를 0x00401146으로 win함수의 시작주소로 이동했다는 것을 알 수 있고 또한 win함수를 실행했다는 것을 알 수 있다.

 

결론

pwntools을 사용하면 쉽게 공격코드를 작성할 수 있다.
반응형

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

Protostar Stack5 문제  (1) 2022.09.21
Protostar Stack4 문제  (0) 2022.09.17
Protostar Stack2 문제  (2) 2022.09.14
Protostar Stack1 문제  (2) 2022.09.12
Protostar Stack0 문제  (4) 2022.09.11