패스워드
[LOB] Level7: darkelf → orge (renew)
orge /* 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("argv[0] error\n"); exit(0); } // egghunter for(i=0; environ[i]; i++) memset(environ[i], 0, strlen(environ[i])); if(a..
[LOB] Level3: cobolt → goblin (renew)
goblin keyword : BoF+env+argv /* The Lord of the BOF : The Fellowship of the BOF - goblin - small buffer + stdin */ int main() { char buffer[16]; gets(buffer); printf("%s\n", buffer); } 0x01. Static Analysis 앞서 문제 cobolt와 다른점은 cobolt에서는 main함수의 argv로 입력값을 받았다면, 지금 문제는 gets를 이용하여 문제를 받는다. 따라서 값을 넘겨주는 방식의 차이만 있을 뿐 앞 문제와 풀이 과정은 동일하다. 0x02. Dynamic Analysis & Exploit cobolt 문제와 동일하게 환경변수에 쉘코드를 넣고 문제..
[LOB] Level2: gremlin → cobolt (renew)
Cobolt keyword : BoF+env 0x01. Static Analysis /* The Lord of the BOF : The Fellowship of the BOF - cobolt - small buffer */ int main(int argc, char *argv[]) { char buffer[16]; if(argc < 2){ printf("argv error\n"); exit(0); } strcpy(buffer, argv[1]); printf("%s\n", buffer); } 주어진 cobolt바이너리의 소스코드를 살펴보자.buffer의 크기는 16바이트인데 strcpy로 크기 제한없이 argv의 인자값을 buffer로 복사한다.전 문제인 gremlin과 마찬가지로 BoF 취약점이 존재한다..
[LOB] Level1: gate → gremlin (renew)
gremlin keyword : BoF 0x01. Static Analysis /* The Lord of the BOF : The Fellowship of the BOF - gremlin - simple BOF */ int main(int argc, char *argv[]) { char buffer[256]; if(argc < 2){ printf("argv error\n"); exit(0); } strcpy(buffer, argv[1]); printf("%s\n", buffer); } 제공되는 소스코드를 살펴보면 굉장히 단순한 프로그램이다.argv인자로 받은 값을 strcpy함수를 이용하여 buffer에 저장하는데, buffer의 크기는 256바이트이다.여기서 Buffer OverFlow 취약점이 존재한..
[해커스쿨] FTZ level19 풀이과정
2017/01/12 - [Study :)/FTZ] - [해커스쿨] FTZ level18 풀이과정 main() { char buf[20]; gets(buf); printf("%s\n",buf); } 힌트를 보면, buf사이즈는 20Byte이다. buf에 쉘코드를 넣기에는 작은 사이즈이므로, 환경변수에 쉘코드를 넣고 시작하자. //getenv.c main(){ printf("[%08p]\n", getenv("SHELL") ); } ShellCode(41Byte) \x31\xc0\xb0\x31\xcd\x80\x89\xc3\x89\xc1\x31\xc0\xb0\x46\xcd\x80\x31\xc0\x50\x68\x2f\x2f\x73\x68\x68\x2f\x62\x69\x6e\x89\xe3\x50\x53\x89\xe..
[해커스쿨] FTZ level18 풀이과정
2017/01/12 - [Study :)/FTZ] - [해커스쿨] FTZ level17 풀이과정 #include #include #include #include void shellout(void); int main() { char string[100]; int check; int x = 0; int count = 0; fd_set fds; printf("Enter your command: "); fflush(stdout); while(1) { if(count >= 100) printf("what are you trying to do?\n"); if(check == 0xdeadbeef) shellout(); else { FD_ZERO(&fds); FD_SET(STDIN_FILENO,&fds); if(sel..
[해커스쿨] FTZ level17 풀이과정
2017/01/12 - [Study :)/FTZ] - [해커스쿨] FTZ level16 풀이과정 힌트 보자..level16에서는 shell()함수가 따로 존재하여 shell()함수에 setreuid()함수가 들어있었다.그래서 printit()함수를 불러오는 주소에 shel()함수 주소를 대체해서 넣어서 문제를 풀었다면,level17에서는 shell()이라는 함수가 따로 없고 main()함수에 포함되어 있다.문제를 풀기 전 예상을 해보면, main()함수에 call(); 명령어를 통해서 원하는 주소의 값을 실행 하는 방법과, 앞서 풀었던 BOF방식으로 RET주소에 원하는 주소를 넣는 방법이 있을 것 같다고 판단된다.이렇게 2가지 방법을 생각해 두고 문제를 풀어보자.... 먼저, hint의 내용을 /home..