Wargame 🎮/⭐ Protostar

반응형
Wargame 🎮/⭐ Protostar

[Protostar] Stack7

[Protostar] Stack7 #include #include #include #include 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(); } stack6번과 ..

Wargame 🎮/⭐ Protostar

[Protostar] Stack6

[Protostar] Stack6 #include #include #include #include void getpath() { char buffer[64]; unsigned int ret; printf("input path please: "); fflush(stdout); gets(buffer); ret = __builtin_return_address(0); if((ret & 0xbf000000) == 0xbf000000) { printf("bzzzt (%p)\n", ret); _exit(1); } printf("got path %s\n", buffer); } int main(int argc, char **argv) { getpath(); } main함수에서 getpath()함수를 실행시킨다. 1. g..

Wargame 🎮/⭐ Protostar

[Protostar] Stack5

[Protostar] Stack5 #include #include #include #include int main(int argc, char **argv) { char buffer[64]; gets(buffer); } 이 문제는 쉘코드를 삽입하고 ret를 쉘코드가 있는 위치로 변조하여 해결하는 문제이다. 코드를 보면, buffer는 64bytes이지만, gets함수에서 길이값 검증을 하지 않기 때문에 여기서 buffer overflow가 발생한다. gdb로 stack5 파일을 확인하면, 매우 간단하다. sub esp, 0x50이고 gets함수가 실행되기 전 인자값 buffer가 esp+0x10에 들어 있다. 그래서 스택 구조를 그리면 아래와 같다. 우선, buffer와 sfp 사이의 dummy값의 길이를..

Wargame 🎮/⭐ Protostar

[Protostar] Stack4

[Protostar] Stack4 #include #include #include #include void win() { printf("code flow successfully changed\n"); } int main(int argc, char **argv) { char buffer[64]; gets(buffer); } 1. win()함수와 main()함수가 존재하고, win()함수가 실행되어야 문제가 해결된다. 2. gets(buffer)에서 길이 검증을 하지 않아서 👉 buffer overflow가 발생 3. main함수에서는 따로 함수를 실행하는 부분이 없다. 👉 ret부분을 win()함수 주소로 바꾸면 된다. 스택으로 그려보면 아래와 같다. 우선 main함수를 gdb로 보게 되면, 아래와 같다...

Wargame 🎮/⭐ Protostar

[Protostar] Stack3

[Protostar] Stack3 #include #include #include #include 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(); } } 1. 이번에는 함수가 main()함수와 win()함수 2개이고, win()함수가 실행되어야 문제풀이에 성공한다. 2. 변수를 보면 *fp 포인터가 선언 3. gets(buffer); 로 길이값 검..

Wargame 🎮/⭐ Protostar

[Protostar] Stack2

[Protostar] Stack2 #include #include #include #include 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("..

Wargame 🎮/⭐ Protostar

[Protostar] Stack1

[Protostar] Stack1 #include #include #include #include int main(int argc, char **argv) { volatile int modified; char buffer[64]; if(argc == 1) { errx(1, "please specify an argument\n"); } modified = 0; strcpy(buffer, argv[1]); if(modified == 0x61626364) { printf("you have correctly got the variable to the right value\n"); } else { printf("Try again, you got 0x%08x\n", modified); } } 1. argc == 1..

Wargame 🎮/⭐ Protostar

[Protostar] Stack0

[Protostar] Stack0 #include #include #include int main(int argc, char **argv) { volatile int modified; char buffer[64]; modified = 0; gets(buffer); if(modified != 0) { printf("you have changed the 'modified' variable\n"); } else { printf("Try again?\n"); } } 1. buffer는 64bytes이고 gets(buffer);에서 입력값에 대해 길이 검증을하지 않는다. 👉 여기서 buffer overflow가 일어난다. 2. 문제는 if문 조건을 만족시키는 건데 modified의 값이 0이 아니면 성공하는 것!..

반응형
제나나
'Wargame 🎮/⭐ Protostar' 카테고리의 글 목록 (2 Page)