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함수가 실행 될 것이다. 바로 문제를 풀어 보겠다.
문제 풀이
Stack3을 실행한 뒤 a를 조금 넣으니 아무런 출력도 없다.
a를 100개 생성한 뒤 Stack3에 넣으니 0x616161로 점프를 하였다는 것을 알 수있다. 그리고 0x616161을 실행할 수 없으니 segment 오류가 난것을 알 수 있다. 우리는 문제를 위해서 fp부분의 win의 시작주소를 넣어야 win함수를 실행할 수 있을것이다.
info functions을 통하여 함수를 볼 수 있고 왼쪽에 주소들도 볼 수 있다. 다른 방법으로 함수의 이름을 알 경우 disas win을 통하여서도 함수의 시작주소를 알 수있다.
win의 시작주소는 0x0000000000401146이다.
main함수를 보면 main+35 부분에서 gets로 문자들을 입력받고 main+40 위치에서 rbp-8부분과 0이랑 비교를한다. 이 부분이 fp가 0인지 아닌지 비교하는 구문인것 같고 main+83번째 위치에 call rdx를 실행하는데 이 부분은 fp함수를 실행하는 부분일 것이라고 예상된다. 먼저 main+40부분에 브레이크 포인터를 걸어서 한번 실행하도록 하겠다.
먼저 pattern create 100으로 패턴이있는 문자열을 생성한 후 값을 입력하여 주었다.
값을 입력한 후 run을 실행하니 main+40부분에 잘 도착한 것을 볼 수 있다.
rbp -8 부분과 0을 비교하고 있으므로 rbp -8에 무슨 값이 들어있는지 확인하여야 한다.
rbp -8 부분을 확인 하니 0x4134414165414149이라는 값이 들어 있다.
pattern offset으로 확인을 해보니 72번째 떨어져 있다고 한다. 72번째 떨어진 위치로부터 fp함수가 변조가 된다는 것을 알 수있다. 우리는 72번째 뒤에 win의 시작주소를 넣으면 win을 실행할 수 있을 것이다.
pwntools을 사용하여 payload를 작성한 후 전송하도록 하겠다.
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 |