Protostar Stack2
https://exploit.education/protostar/stack-two/
Stack Two :: Andrew Griffiths' Exploit Education
Stack Two Stack2 looks at environment variables, and how they can be set. This level is at /opt/protostar/bin/stack2 Source code #include #include #include #include int main(int argc, char **argv) { volatile int modified; char buffer[64]; char *variable; v
exploit.education
위 사이트에 접속을 하면 Stack Two문제의 소스코드를 볼 수 있다.
Source Code
#include <stdlib.h>
#include <unistd.h>
#include <stdio.h>
#include <string.h>
int main(int argc, char **argv)
{
volatile int modified;
char buffer[64];
char *variable;
variable = getenv("GREENIE");
if(variable == NULL) {
errx(1, "please set the GREENIE environment variable\n");
}
modified = 0;
strcpy(buffer, variable);
if(modified == 0x0d0a0d0a) {
printf("you have correctly modified the variable\n");
} else {
printf("Try again, you got 0x%08x\n", modified);
}
}
위의 소스코드를 보면 전과 다르게 getenv라는 녀석이 보인다.
getenv라는 녀석은 환경변수의 값을 읽어오는 함수이다. GREENIE라는 이름을 가진 환경변수를 찾아서 값을 variable에 저장시키는데 만약 GREENIE라는 환경변수가 없으면 NULL을 출력한다.
이 문제는 환경변수에 값을 저장시켜 modified를 우리가 원하는 값으로 변조하면 될것이다.
이번 실습에서는 peda라는 디버거를 사용할 것이다.
peda 디버거 설치
https://github.com/longld/peda
GitHub - longld/peda: PEDA - Python Exploit Development Assistance for GDB
PEDA - Python Exploit Development Assistance for GDB - GitHub - longld/peda: PEDA - Python Exploit Development Assistance for GDB
github.com
위 사이트에서 peda를 다운받을 수 있다.
설치를 하기 위해서는 Installation에서 코드를 붙여넣으면 된다.
그림 1에 있는 코드를 붙여넣어서 설치를 완료하였다.
전에 실습한 Stack1을 gdb로 열었더니 gdb-peda라고 뜬다. peda가 잘동작하고 있다는 것이다.
문제 풀이
Stack2를 컴파일 하고 실행을 하니 GREENIE라는 환경 변수를 설정하라고 오류메세지가 출력되고 있다.
환경 변수 GREENIE를 설정을 한 후 Stack2를 실행하니 잘 작동되어 환경변수가 정상적으로 설정 되어있다는 것을 알 수 있다.
peda를 사용하면 set disassembly-flavor intel을 설정안해도 intel방식으로 되어있어서 편리하다.
disas main으로 main함수를 디스어셈블한후 modified값을 비교하는 main+95 번째 위치에 브레이크 포인트를 걸었다.
실행에 앞서 peda의 pattern create에 대해 살펴보겠다.
pattern create 숫자를 입력하면 숫자만큼 패턴을 만들어낸다. 이 패턴으로 처음부터 얼마나 떨어져있는지 알 수가있어서 자주 사용된다.
pattern offset을 이용하면 처음부터 얼마나 떨어진지 알려준다.
peda로 만들어낸 패턴을 환경변수에 재설정을 한 후 디버깅을 시작하겠다.
Stack2를 디버깅한후 main+95위치에 브레이크 포인트를 넣고 run으로 실행을 하였다. 전과는 다르게 peda를 이용하니 레지스터, 코드, 스택 등 다양한 정보들을 보여줘서 편리하다.
eax값을 확인해보니 0x41413341로 A3AA가 들어있음을 알 수 있다.
offset을 확인해보니 68번째 떨어져있음을 알 수 있다.
공격코드를 짜기에 앞서 modified를 0x0d0a0d0a로 설정을 해야하는데 개행문자이므로 제대로 전달이 안될수도 있기 때문에 python을 이용하여 전달하겠다.
GREENIE 환경변수에 python으로 짠 공격코드를 넣은 후 Stack2를 실행하면 우리가 modified를 변조하였다고 나온다.
문제를 해결하였다. gdb로 한번 살펴보겠다.
gdb로 modified값을 비교하는 곳에서 rax 값을 확인해보면 0x0d0a0d0a ('\n\r\n\r')이 잘 들어간것을 알 수 있다.
결론
오리지널 gdb를 쓰다가 peda를 쓰니 편하다.
'System hacking > 프로토스타(Protostar)' 카테고리의 다른 글
Protostar Stack4 문제 (0) | 2022.09.17 |
---|---|
Protostar Stack3 문제 (0) | 2022.09.16 |
Protostar Stack1 문제 (2) | 2022.09.12 |
Protostar Stack0 문제 (4) | 2022.09.11 |
Protostar 설치 및 실행 (1) | 2022.09.10 |