Protostar Stack7
Protostar Stack7
https://exploit.education/protostar/stack-seven/
Stack Seven :: Andrew Griffiths' Exploit Education
Stack Seven Stack6 introduces return to .text to gain code execution. The metasploit tool “msfelfscan” can make searching for suitable instructions very easy, otherwise looking through objdump output will suffice. This level is at /opt/protostar/bin/st
exploit.education
위 사이트에 접속을 하면 Stack Seven문제의 소스코드를 볼 수 있다.
문제 설명
Source Code
#include <stdlib.h>
#include <unistd.h>
#include <stdio.h>
#include <string.h>
char *getpath()
{
char buffer[64];
unsigned int ret;
printf("input path please: "); fflush(stdout);
gets(buffer);
ret = __builtin_return_address(0);
if((ret & 0xb0000000) == 0xb0000000) {
printf("bzzzt (%p)\n", ret);
_exit(1);
}
printf("got path %s\n", buffer);
return strdup(buffer);
}
int main(int argc, char **argv)
{
getpath();
}
소스코드에서 gets로 buffer의 입력을 받고있고 ret의 주소를 불러와 검증을 하고 있다. 0xb0000000와 비교하고 있기 때문에 ret에 system명령어를 사용하지 못할것이고 스택에 쉘코드를 넣어 실행하지 못할 것이다.
문제 풀이
Stack7을 실행하면 입력한 값을 그대로 출력한다.
gdb를 이용하여 디버깅한 후 main까지 실행하여 system과 /bin/sh의 위치를 찾았다.
pattern offset으로 ret의 offset을 확인하였다.
buffer로부터 88번째 떨어진 위치이다.
이걸로 poc코드를 작성하여 실행하였지만 익스플로잇에 실패를 하였다. 다른 방식으로 해보겠다.
ropgadget을 이용하여 ret의 주소를 구하였다.
buf를 88만큼 채우고 ropgadget으로 0x401016위치에 있는 ret의 주소로 채운다. 0x401016이기때문에 검증에서 걸리지 않는다. 그리고 그 다음 쉘코드를 가리키는 주소로 채우고 쉘코드를 채우면 공격에 성공한다.
[buf -> ret(0x401016) -> ret(쉘코드 위치) -> 쉘코드]
위에 따라서 poc코드를 작성하였다.
작성한 poc코드를 실행하여 익스플로잇에 성공하였다. ^^데헷쿵 찡긋^^