본문 바로가기

해커스쿨 FTZ 문제풀이 최종본 pdf by ORANG 몇일간 틈틈이 작성한건데.. 다 쓰고나니 뿌듯하네요ㅎㅎ이제와서 생각해보니 설명이 부족했던 부분이 많았던 것 같기도 하네요ㅠㅠ제가 생각하는 것들을 그대로 글로 표현한다는게 생각보다 너무 어려운 것 같습니다...읽다가 궁금한 부분이나, 잘못 설명된 부분 발견하신 분은 댓글 달아주시면 감사하겠습니다!!다른 공부와 같이 하느라.. LOB 문제풀이는 틈틈이 시간날 때마다 작성하겠습니다!! 모두들 열공하시길ㅎㅎ!! 더보기
해커스쿨 FTZ ( level20 -> clear ) + 포맷스트링버그의 이해 by ORANG FTZ_level20 마지막 문제네요ㅎㅎ level20은 포맷스트링 문제입니다지금까지 풀어온 BOF와는 다른 방법을 이용해야하죠먼저 포맷스트링버그( FSB : Format String Bug )에 대한 개념부터 가볍게 잡겠습니다. 음.. 포맷스트링은 c언어 printf 에서 사용하는 %d, %x, %f 같은 문자 입니다. %c 단일 문자 %d 부호 있는 10진 정수 %i 부호 있는 10진 정수, %d 와 같음 %f 부호 있는 10진 실수 %s 문자열 %o 부호 없는 8진수 %u 부호 없는 10진수 %x 부호 없는 16진수 %e 부동 소수점 표기, e 사용 %n 쓰인 총 바이트 수 등이 있죠ㅎㅎ여기서 FSB에 가장 중요한 포맷스트링은 %x와 %n입니다%x는 부호없는 16진수 출력이죠 -> 16진수 출력이라.. 더보기
해커스쿨 FTZ ( level19 -> level20 ) by ORANG FTZ_level19 [level19@ftz level19]$ bash2[level19@ftz level19]$ cat hint main(){ char buf[20]; gets(buf); printf("%s\n",buf);} bash2 띄우고~ hint를 보겠습니다.level18 문제 보다가 이걸 보니 참 좋네요ㅋㅋㅋ너무 간단한 BOF문제네요 자세히 보면 setreuid 함수가 없는게 약간의 문제인 것 같네요하지만 권한을 살펴보면 당연히 setuid가 걸려있습니다 [level19@ftz level19]$ ls -l attackme-rwsr-x--- 1 level20 level19 13615 3월 8 2003 attackme 이럴땐 간단하게, setuid + bash셸을 실행하는 셸코드를 작성하면 됩니다... 더보기
해커스쿨 FTZ ( level18 -> level19 ) by ORANG FTZ_level18 [level18@ftz level18]$ bash2[level18@ftz level18]$ cat hint #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_FILE.. 더보기
해커스쿨 FTZ ( level17 -> level18 ) by ORANG FTZ_level17 [level17@ftz level17]$ bash2[level17@ftz level17]$ cat hint #include void printit() { printf("Hello there!\n");} main(){ int crap; void (*call)()=printit; char buf[20]; fgets(buf,48,stdin); setreuid(3098,3098); call();} bash2 띄우고~~ 힌트를 보니 level16문제에서 shell 함수가 사라진 것 같네요ㅎㅎbuf에 셸코드를 집어넣고, printit 함수의 호출 부분( call(); )을 buf의 주소로 바꿔주면 될 것 같습니다. gdb로 분석하고 메모리 구조를 그려보겠습니다~ (gdb) disas mainD.. 더보기
해커스쿨 FTZ ( level16 -> level17 ) by ORANG FTZ_level16 [level16@ftz level16]$ bash2[level16@ftz level16]$ cat hint #include void shell() { setreuid(3097,3097); system("/bin/sh");} void printit() { printf("Hello there!\n");} main(){ int crap; void (*call)()=printit; char buf[20]; fgets(buf,48,stdin); call();} bash2 띄우고~ 힌트를 확인해보겠습니다!printit함수의 호출부분( call(); )이 있으니 그 부분에서 shell 함수를 호출하도록 바꿔주겠습니다. gdb를 이용해 분석해보겠습니다. (gdb) disas mainDump of .. 더보기
해커스쿨 FTZ ( level15 -> level16 ) by ORANG FTZ_level15 [level15@ftz level15]$ bash2[level15@ftz level15]$ cat hint #include main(){ int crap; int *check; char buf[20]; fgets(buf,45,stdin); if (*check==0xdeadbeef) { setreuid(3096,3096); system("/bin/sh"); }} 이번에도 bash2를 띄우고!! 힌트를 보겠습니다level14와 아주 비슷하지만 check 가 포인터로 되어있네요ㅎㅎ0xdeadbeef를 넣어주고, 그 주소를 가리키도록 바꾸어 공격해보겠습니다. 메모리 구조를 그리는 과정은 level14와 같으므로 생략하겠습니다.buf 의 시작 주소가 필요하겠네요ㅎㅎ 찾아보겠습니다. RET [.. 더보기
해커스쿨 FTZ ( level14 -> level15 ) by ORANG FTZ_level14 [level14@ftz level14]$ bash2[level14@ftz level14]$ cat hint 레벨14 이후로는 mainsource의 문제를 그대로 가져왔습니다.버퍼 오버플로우, 포맷스트링을 학습하는데는 이 문제들이최고의 효과를 가져다줍니다. #include #include main(){ int crap; int check; char buf[20]; fgets(buf,45,stdin); if (check==0xdeadbeef) { setreuid(3095,3095); system("/bin/sh"); }} bash2부터 띄우고~~ 힌트를 보니 level14와 비슷합니다 ㅎㅎ하지만 fgets 함수로 입력받는 최대 크기가 45바이트로 되어있네요check 부분을 0xdeadb.. 더보기
해커스쿨 FTZ ( level13 -> level14 ) by ORANG FTZ_level13 [level13@ftz level13]$ bash2[level13@ftz level13]$ cat hint #include main(int argc, char *argv[]){ long i=0x1234567; char buf[1024]; setreuid( 3094, 3094 ); if(argc > 1) strcpy(buf,argv[1]); if(i != 0x1234567) { printf(" Warnning: Buffer Overflow !!! \n"); kill(0,11); }} 먼저 bash2를 띄우고, 힌트를 확인해보니 역시 BOF문제네요 long형 변수 i를 두고 값이 조작될시에 BOF를 감지하고 종료하는것 같습니다.그렇다면 i부분을 0x1234567로 덮어씌어줌으로 우회하면.. 더보기
해커스쿨 FTZ ( level12 -> level13 ) by ORANG FTZ_level12 [level12@ftz level12]$ bash2[level12@ftz level12]$ cat hint #include #include #include int main( void ){ char str[256]; setreuid( 3093, 3093 ); printf( "문장을 입력하세요.\n" ); gets( str ); printf( "%s\n", str );} bash2부터 띄워주시고요~~level11과 비슷하지만 인자로 전달받지 않는다는점만 다르네요ㅎㅎgets 함수 역시 입력받을 수 있는 문자열 크기 제한이 없으므로 BOF 취약점이 있습니다. 간단하게 분석후, 메모리 구조를 그려보겠습니다. (gdb) disas mainDump of assembler code for func.. 더보기