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문제의 소스코드를 볼 수 있다.
문제 설명
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가 발생한다. 이를 이용하여 쉘코드를 실행하도록 하겠다.
msfvenom을 이용하여 쉘코드를 만들기 이전에 리눅스 관련된 페이로드를 확인 해 보겠다.
linux/x64/exec라는 쉘코드를 사용하겠다.
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 권한으로 특정 파일을 쓰거나 내용을 추가할때 위의 문제를 해결할 수 있다.
main함수를 살펴보면 rsp를 0x50만큼 값을 빼주어 필요한만큼 스택프레임을 할당받았을을 알 수 있고 gets함수를 불러오기 전에 rax에 rbp-0x40을 저장하고 gets함수를 호출하는것을 알 수 있다. 여기에서 buffer는 rbp-0x40부터 데이터가 저장되는 것을 추측할 수 있다. 일단 ret위치에 브레이크 포인트를 걸고 실행해 보도록 하겠다.
스택 상단의 데이터를 확인하여 ret의 위치를 확인해보니 buffer에서 72바이트 만큼 떨어져 있다. 그림 5에서 buffer가 rbp-0x40부터 저장된다고 하였는데 그림 6에서 확인할 수 있다. 0x40은 10진수로 64이기때문에 64바이트에서 rbp값 8바이트를 더하면 72바이트가 되므로 rbp-0x40부터 buffer가 저장된다.
우리가 buffer로부터 72바이트 떨어져있음을 알았기 때문에 아무값으로 72바이트 채우고 ret함수 다음에 buf를 채워줬다.
어태치를 하여 한번 확인해보겠다.
Stack5.py를 실행하니 pause()함수로 인해 잠시 멈춘것을 알수있고 pid를 확인할 수 있다.
gdb로 실행해보도록 하겠다.
그림 10번을 보면 스택 최상단에 0xffff가 들어온것을 알 수 있다. 우리는 ret값을 buf가 있는 값으로 바꿔 쉘코드를 실행할 것이다.
ret함수에 buf의 위치를 넣어주었고 p.interactive()를 이용하여 쉘을 획득하였을 때 상호작용을 하도록 하였다.
쉘코드를 실행하여 익스플로잇에 성공을 하였다.
'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 |