System hacking/프로토스타(Protostar)

Protostar Stack5 문제

Roronoa 2022. 9. 21. 23:57
반응형

Protostar Stack5

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

 

Stack Five :: Andrew Griffiths' Exploit Education

Stack Five Stack5 is a standard buffer overflow, this time introducing shellcode. This level is at /opt/protostar/bin/stack5 Hints At this point in time, it might be easier to use someone elses shellcodeIf debugging the shellcode, use \xcc (int3) to stop t

exploit.education

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

문제 설명

[그림 1] 문제 설명

Source Code

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

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

  gets(buffer);
}

 

소스코드 main()함수 부분에 buffer배열이 있고 gets함수로 buffer에 입력을 받는다.

gets함수로 문자열들을 입력받기 때문에 buffer overflow가 발생한다. 이를 이용하여 쉘코드를 실행하도록 하겠다.

 

[그림 2] msfvenom에서 linux관련 페이로드 확인

msfvenom을 이용하여 쉘코드를 만들기 이전에 리눅스 관련된 페이로드를 확인 해 보겠다.

 

[그림 3] linux 64bit 쉘코드

linux/x64/exec라는 쉘코드를 사용하겠다.

 

[그림 4] msfvenom을 이용하여 쉘코드 생성

msfvenom을 이용하여 쉘코드를 생성하였다.

쉘코드는 pwntools를 이용하여 payload를 작성할때 이용할 것 이다.

먼저 Kali linux는 ASLR이 걸려있기 때문에 ASLR을 꺼야한다.

  • ASLR이란 스택, 힙, 라이브러리 등 주소를 랜덤으로 프로세스 주소공간에 배치하는 기법이다. ASLR을 이용하면 매번 프로그램을 시작할 때 주소를 무작위로 바꾸기 때문에 직접적인 메모리를 참조하기 어려워진다. 따라서 우리는 ASLR을 제거하고 실습을 실행하도록 하겠다.
echo 0 | sudo tee /proc/sys/kernel/randomize_va_space

위 명령어를 사용하여 ASLR 기능을 껐다.

위 명령에서 tee라는 명령어를 사용하는데 tee명령어는 표준입력을 읽어서 표준 출력과 파일에 쓰는 명령어이다.

일반적인 append(>>)명령어를 사용하여 출력을 리다이렉션 할 경우 sudo를 사용해도 일반사용자로 전환되므로 root 권한으로 파일에 쓰거나 내용 추가가 필요한 경우 제대로 동작하지 않는다. 하지만 tee를 이용하면 shells cript에서 root 권한으로 특정 파일을 쓰거나 내용을 추가할때 위의 문제를 해결할 수 있다.

 

[그림 5] Stack5 디버깅

main함수를 살펴보면 rsp를 0x50만큼 값을 빼주어 필요한만큼 스택프레임을 할당받았을을 알 수 있고 gets함수를 불러오기 전에 rax에 rbp-0x40을 저장하고 gets함수를 호출하는것을 알 수 있다. 여기에서 buffer는 rbp-0x40부터 데이터가 저장되는 것을 추측할 수 있다. 일단 ret위치에 브레이크 포인트를 걸고 실행해 보도록 하겠다.

 

[그림 6] ret위치 확인

스택 상단의 데이터를 확인하여 ret의 위치를 확인해보니 buffer에서 72바이트 만큼 떨어져 있다. 그림 5에서 buffer가 rbp-0x40부터 저장된다고 하였는데 그림 6에서 확인할 수 있다. 0x40은 10진수로 64이기때문에 64바이트에서 rbp값 8바이트를 더하면 72바이트가 되므로 rbp-0x40부터 buffer가 저장된다.

 

[그림 7] Stack5.py pause()를 통하여 어태치

우리가 buffer로부터 72바이트 떨어져있음을 알았기 때문에 아무값으로 72바이트 채우고 ret함수 다음에 buf를 채워줬다.

어태치를 하여 한번 확인해보겠다.

 

[그림 8] Stack5.py 실행

Stack5.py를 실행하니 pause()함수로 인해 잠시 멈춘것을 알수있고 pid를 확인할 수 있다.

gdb로 실행해보도록 하겠다.

[그림 9] 어태치 실행
[그림 10] Stack5 확인

그림 10번을 보면 스택 최상단에 0xffff가 들어온것을 알 수 있다. 우리는 ret값을 buf가 있는 값으로 바꿔 쉘코드를 실행할 것이다.

 

[그림 11] Stack5.py payload작성 마무리

ret함수에 buf의 위치를 넣어주었고 p.interactive()를 이용하여 쉘을 획득하였을 때 상호작용을 하도록 하였다.

 

[그림 12] shell code 실행

쉘코드를 실행하여 익스플로잇에 성공을 하였다.

반응형

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

Protostar Stack6[RTL]  (2) 2022.09.23
Protostar Stack5[RTL이용하여 문제 풀이]  (3) 2022.09.22
Protostar Stack4 문제  (0) 2022.09.17
Protostar Stack3 문제  (0) 2022.09.16
Protostar Stack2 문제  (2) 2022.09.14