버퍼

    [LOB] Level7: darkelf → orge (renew)

    [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] Level6: wolfman → darkelf (renew)

    [LOB] Level6: wolfman → darkelf (renew)

    darkelf keyword : /* The Lord of the BOF : The Fellowship of the BOF - darkelf - egghunter + buffer hunter + check length of argv[1] */ #include #include extern char **environ; main(int argc, char *argv[]) { char buffer[40]; int i; 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(..

    [LOB] Level5: orc → wolfman (renew)

    [LOB] Level5: orc → wolfman (renew)

    wolfman keyword : egghunter+bufferhunter /* The Lord of the BOF : The Fellowship of the BOF - wolfman - egghunter + buffer hunter */ #include #include extern char **environ; main(int argc, char *argv[]) { char buffer[40]; int i; 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("st..

    [LOB] Level4: goblin → orc (renew)

    [LOB] Level4: goblin → orc (renew)

    orc keyword : BoF+egghunter /* The Lord of the BOF : The Fellowship of the BOF - orc - egghunter */ #include #include extern char **environ; main(int argc, char *argv[]) { char buffer[40]; int i; 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("stack is still your friend.\n"); ex..

    [LOB] Level3: cobolt → goblin (renew)

    [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)

    [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)

    [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 취약점이 존재한..

    [지식]버퍼링(Buffering)과 스풀링(Spooling)

    [지식]버퍼링(Buffering)과 스풀링(Spooling)

    운영체제 입출력방식 중 버퍼링(Buffering)과 스풀링(Spooling)에 대해 알아보고 싶었다.사전적 의미부터 알아보자. 버퍼링(Buffering)버퍼링은 사전적 의미로 완충, 완화장치의 개념으로 두 개의 매개사이에서 충돌을 완화하는 장치로 설명된다. 동영상 파일이 구현될 때 네트웍의 상황에 따라 끊어짐과 같은 현상이 발생할 수 있는데. 이때 버퍼링을 통해 일시적으로 데이터를 기억해 내어 다음 데이터와 원활하게 연결시켜 준다. [네이버 지식백과] 버퍼링 [buffering] (용어해설)정보의 송수신을 원활하게 하기 위해서 정보를 일시적으로 저장하여 처리 속도의 차를 흡수하는 방법. 좀 더 검색해보면 IT용어 대사전에 버퍼링(Buffering)보다, 완충(Buffering)으로 검색하면 우리가 원하는..