System hacking/프로토스타(Protostar)

Protostar Stack4 문제

Roronoa 2022. 9. 17. 18:08
반응형

Protostar Stack4

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

 

Stack Four :: Andrew Griffiths' Exploit Education

Stack Four Stack4 takes a look at overwriting saved EIP and standard buffer overflows. This level is at /opt/protostar/bin/stack4 Hints A variety of introductory papers into buffer overflows may help.gdb lets you do “run < input”EIP is not directly aft

exploit.education

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

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)
{
  char buffer[64];

  gets(buffer);
}

소스코드를 보면 main함수와 win이라는 함수가 있다. main함수에서 buffer를 입력받고있고 끝이난다.

이 문제는 main함수가 호출되고 return 될때 win()함수를 출력하는 문제임을 유추해볼 수 있다.

main함수에서 gets로 buffer를 입력받고 있지만 길이를 검증하지 않기 때문에 buffer가 지정된 크기보다 더 많은 데이터가 들어가 buffer overflow가 발생할 수 있다. buffer를 가득채우고 ebp까지 가득채워 return에서 win함수의 시작부분을 넣어주면 main함수가 끝날 때 win함수를 실행할 수 있을 것이다.

문제 풀이

[그림 1] Stack4 컴파일 후 실행

Stack4번을 실행을 하면 gets로 문자들을 입력을 받을 수 있다.

gets로 입력을 받기 때문에 buffer에 지정된 크기보다 더많은 데이터를 입력받을 수 있다.

많은 데이터를 넣었을 경우 segmentation fault를 출력하며 오류가 난다.

 

[그림 2] main 화면

그림 2는 main함수를 disassemble한 화면이다.

main+27번째 위치에서 gets를 사용하여 문자열들을 입력받고 main+38번째 위치에서는 ret으로 다음에 실행할 함수의 위치를 가지고 있다.

 

[그림 3] main함수 실행

먼저 return위치인 main+38번째 위치에 브레이크포인터를 걸고 pattern create로 100개의 문자열을 가진 패턴을 입력하여 return 위치에서 rsp를 확인해보도록 하겠다.

 

[그림 4] ret에서 rsp확인

ret위치인 main+38위치에서 스택 젤 상단인 rsp를 확인해보니 우리가 만든 패턴들이 들어있음을 알 수 있고 이 패턴의 offset을 확인해보니 72라는 것을 알 수 있다. 이것은 우리가 입력한 buffer에서 72번째 위치에 떨어져있다는 것이다.

우리는 win함수를 실행해야하니 win함수의 주소값을 알아야한다.

 

[그림 5] win의 시작주소

disas win을 통하여 win함수의 시작 주소를 알 수 있다.

win함수의 시작주소는 0x0000000000401136이다.

pwntools를 이용하여 공격코드를 작성하겠다.

 

[그림 6] pwntools사용하여 공격코드 작성

로컬에 payload를 전송하기 위해서 process에 경로를 입력하면 된다.

win함수의 주소를 p64로 리틀엔디언 방식으로 패킹을 하였고 payload에 72바이트의 쓰레기 값과 패킹한 win함수의 주소를 넣어 ./Stack4로 payload를 보내주었다.

 

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

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

그 결과 code flow successfully changed라는 문자열이 실행되었고 win함수로 우회가 된것을 알 수 있다.

반응형

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

Protostar Stack5[RTL이용하여 문제 풀이]  (3) 2022.09.22
Protostar Stack5 문제  (1) 2022.09.21
Protostar Stack3 문제  (0) 2022.09.16
Protostar Stack2 문제  (2) 2022.09.14
Protostar Stack1 문제  (2) 2022.09.12