목록Wargame/LOB (17)
Sh4n3e
이번 문제는 이전 문제와 비슷하면서도 약간 응용이 필요한 문제이다. 보면 FEBP라고 써있는데, 딱봐도 EBP를 이용해라 라고 말해주고있다. [assassin@localhost assassin]$ cat zombie_assassin.c/* The Lord of the BOF : The Fellowship of the BOF - zombie_assassin - FEBP*/ #include #include main(int argc, char *argv[]){char buffer[40]; if(argc < 2){printf("argv error\n");exit(0);} if(argv[1][47] == '\xbf'){printf("stack retbayed you!\n");exit(0);} if(argv[1][..
해당 문제는 RET에 \xbf와 \x40을 쓰지못하는 문제다.이것은 기존 Stack으로 Return해서 Shellcode를 실행할 수 없고, RTL을 사용할 수 없다.그럼 우리는 딱 argv[1][47]이 \xbf, \x40인 것만 회피하면 된다. 따라서 나는 여기서 main함수의 ret를 다시한번 호출하는 아이디어를 이용했다. [giant@localhost giant]$ cat assassin.c/* The Lord of the BOF : The Fellowship of the BOF - assassin - no stack, no RTL*/ #include #include main(int argc, char *argv[]){char buffer[40]; if(argc < 2){printf("argv e..
이번 문제는 앞의 문제와는 다르게 execve()함수를 이용해서 RTL을 진행해야한다.execve()함수의 속성을 알기위해서는 아래의 주소를 참조한다. 문자열 "/bin/sh" 의 주소값을 얻는 방법과 execve()함수의 주소를 얻는 방법은 이전 문제에서 진행했던것과 동일하다. http://linux.die.net/man/3/execve 아래는 해당 문제의 C코드와 어셈블 코드가 있다. [bugbear@localhost bugbear]$ cat giant.c /* The Lord of the BOF : The Fellowship of the BOF - giant - RTL2*/ #include #include #include main(int argc, char *argv[]){char buffer[40..
해당 문제는 BOF에 Basic RTL을 보면 좀더 쉽게 이해할 수 있다. 아래는 진행관련해서 순서적으로 나열했다. [darkknight@localhost darkknight]$ cat bugbear.c /* The Lord of the BOF : The Fellowship of the BOF - bugbear - RTL1 */ #include #include main(int argc, char *argv[]) { char buffer[40]; int i; if(argc < 2){ printf("argv error\n"); exit(0); } if(argv[1][47] == '\xbf') { printf("stack betrayed you!!\n"); exit(0); } strcpy(buffer, arg..
문제는 아래와 같다. [golem@localhost golem]$ cat darkknight.c/* The Lord of the BOF : The Fellowship of the BOF - darkknight - FPO*/ #include #include void problem_child(char *src){char buffer[40];strncpy(buffer, src, 41);printf("%s\n", buffer);} main(int argc, char *argv[]){if(argc
해당 문제를 풀어보기위해 다양한 삽질을 했지만, 풀이법이 보이지 않아 힌트를 찾아보았고 Shared Library Hijacking을 사용해야 한다는 것을 알았다.. 이부분에 대한 상세한 내용은 http://leekeezz.tistory.com/32 해당 위치에서 확인할 수 있다. 그럼 왜 풀이법이 보이지 않았을까 부터 시작해보자. 해당 프로그램의 소스는 아래와 같은데, 골때리게 Stack의 Ret부분을 제외하고는 변수 buffer의 공간, EBP, Argv[0], Argv[1], Env를 다 0으로 초기화해버린다. 도대체 어찌하란 말인가?! 라는 생각에 잠기게 된다. [skeleton@localhost skeleton]$ cat golem.c /* The Lord of the BOF : The Fell..
[vampire@localhost vampire]$ cat skeleton.c /* The Lord of the BOF : The Fellowship of the BOF - skeleton - argv hunter */ #include #include extern char **environ; main(int argc, char *argv[]) { char buffer[40]; int i, saved_argc; if(argc < 2){ printf("argv error\n"); exit(0); } // egghunter for(i=0; environ[i]; i++) memset(environ[i], 0, strlen(environ[i])); if(argv[1][47] != '\xbf') { printf("..
디스어셈블이 필요없다.. 약간의 아이디어만 필요할뿐...0xbfff대역을 사용하지 못하기 때문에 우리는 환경변수 영역을 많은 양으로 채워서 0xbfff대역을 벗어나 이용한다. [troll@localhost troll]$ cat vampire.c/* The Lord of the BOF : The Fellowship of the BOF - vampire - check 0xbfff*/ #include #include main(int argc, char *argv[]){char buffer[40]; if(argc < 2){printf("argv error\n");exit(0);} if(argv[1][47] != '\xbf'){printf("stack is still your friend.\n");exit(0);..
우선 문제를 설명하기 앞서 문제의 코드부터 살펴보자. [orge@localhost orge]$ cat troll.c/* The Lord of the BOF : The Fellowship of the BOF - troll - check argc + argv hunter*/ #include #include extern char **environ; main(int argc, char *argv[]){char buffer[40];int i; // here is changedif(argc != 2){printf("argc must be two!\n");exit(0);} // egghunter for(i=0; environ[i]; i++)memset(environ[i], 0, strlen(environ[i])); ..
이번 문제는 이상하게도 생각한 방법대로 실행이 되지 않아 애를 먹었다. 하지만 이번 문제를 해결하는 과정중에 해당 문제를 해결할 수 있는 방법이 2가지가 존재함을 알 수 있었다. 우선 이 문제의 소스부터 보기로 하자. /* The Lord of the BOF : The Fellowship of the BOF - orge - check argv[0] */ #include #include extern char **environ; main(int argc, char *argv[]) { char buffer[40]; int i; if(argc < 2){ printf("argv error\n"); exit(0); } // here is changed! if(strlen(argv[0]) != 77){ printf(..