LOB, golem -> darknight 문제 확인 이번 문제에서는 bof에 취약하지 않은 함수인 strncpy가 등장한다. 그렇기 때문에 이번 문제에서부터는 스택 포인터를 어떻게 조정해야 하는지가 중요하다. LOB, golem -> darknight 풀이 이번 문제는 SFP 값을 한바이트 변경시켜 쉘코드가 실행되게끔 해야 하는 문제이다. 버퍼가 40바이트인데 41바이트를 복사하기 때문에 한바이트를 오버플로우시킬 수 있게 된다. problem_child는 아래와 같은 스택을 갖고있는데 problem_child 함수의 leave, ret부터 따라가보면 어떻게 익스를 해야하는지 쉽게 이해할 수 있다. buffer (40) SFP (4) RET (4) 그리고 problem_child 함수의 leave, re..
LOB, skeleton -> golem 문제 확인 이번엔 입력받은 buffer가 저장되는 곳부터 스택 끝까지 전부 초기화하는 stack destroyer 가 추가되었다. 새삼 문제 진짜 단계적으로 잘 낸것 같다...ㅋㅋ /* The Lord of the BOF : The Fellowship of the BOF - golem - stack destroyer */ #include #include extern char **environ; 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 is stil..
LOB, vampire -> skleton 문제 확인 argv 전부를 초기화하는 argv hunter 조건문이 추가되었다. /* 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][..
LOB, troll -> vampire 문제확인 환경변수나 버퍼 초기화 부분이 사라진 대신에 argv[1]에 대한 조건이 추가되었다. 47번째 바이트가 \xff 이면 안되는 조건인데 여태까지 리턴 주소에 bfffXXXX 주소 영역대를 덮었었는데 이 영역대를 쓰지 못하게 되었다. 대신 argv[2]을 쓰지 못하게 argc == 2 조건이 있었던 이전 문제와 다르게 argv[2]를 쓸 수 있게 되었기 때문에 이번 문제는 argv[2]에 쉘코드를 올리는 방식으로 진행하려 한다. LOB, troll -> vampire 풀이 먼저 gdb로 계속 주소값을 확인하는게 번거로워서 argv[2] 주소를 출력하게끔 재컴파일을 진행했다. 그리고 argv[2]에 B값을 1000, 10000, 100000 까지 넣어보면서 ar..
LOB, darkelf -> orge 문제 확인 이전 문제에서 argv[0]의 길이가 77인지 체크하는 조건문이 추가되었다. 그 밖의 설명에 대해선 이전 문제들과 동일하니 따로 설명하지는 않겠다. /* 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] err..
LOB, wolfman -> darkelf 문제 확인 저번 문제와 다른점은, argv[1] 길이체크를 한다는 것이다. 점점 제약조건이 추가되고 있는데 정리하자면 아래와 같다. 환경변수 초기화 버퍼 초기화 arvg[1] 길이체크 48번쨰 바이트 \xbf LOB, wolfman -> darkelf 풀이 현재 스택 상황은 아래와 같다. 참고로 argc, argv[1], argv[1], ... 는 RET 뒤 어딘가 오게된다. i (4) buffer (40) SFP RET ... argc argv[0] argv[1] RET 뒤에 argv 값들의 위치가 정확히 어떻게 되는지 확인해보기 위해 argv[1]과 argv[2]에 A와 B를 각각 넘겨주었다. 쭉쭉 내리다보면 아래 부근에서 0x42 값을 확인할 수 있다. a..
LOB, orc -> wolfman 문제 확인 level4 문제와 거의 동일한데 마지막에 버퍼를 memset으로 초기화한다는 것만 다르다. 어차피 RET 뒤에 쉘코드를 주어서 풀었었기 때문에 버퍼 초기화는 영향이 없다. 따라서 이전 문제와 동일한 방식으로 풀이를 진행하도록 한다. LOB, orc -> wolfman 문제 풀이 현재 스택 상황은 아래와 같다. i buffer SFP RET 4 40 4 4 strcpy 호출 뒤인 main+194에 bp를 건 후 실행시키고 버퍼 주소값을 확인해준다. LOB, orc -> wolfman 익스플로잇 RET 앞에 44바이트 더미값을 준 다음 RET 자리에 덮어쓸 주소로 위 스택에서 확인한 적당한 주소값을 준다. 그리고 그 뒤에 nop과 쉘코드를 준다. ./wolfm..
LOB, goblin -> orc 문제 확인 strcpy 취약점을 이용해 bof를 하는 문제인데 앞에 2개정도 고려할 요소가 생겼다. 첫번째는 egghunter로 환경변수를 전부 초기화하고 있기 때문에 환경변수를 사용하지 않고 문제를 풀어야 한다는 것이고 두번째는 argv의 48번째 값이 \xbf여야 한다는 것이다. LOB, goblin -> orc 풀이 main문을 gdb로 확인해주면 일단 dummy값은 없는 것으로 확인되기 때문에 스택 상황은 아래와 같다. i buffer SFP RET 4 40 4 4 환경변수를 사용하지 못하기 때문에 gdb상에서 입력값이 저장되는 버퍼 주소값을 알아낼 필요가 있다. strcpy 바로 뒤인 main+194에 bp를 건다. 그리고 48번째 바이트가 \xbf가 아니면 프..
LOB, gremlin -> cobolt 문제 확인 gate -> gremlin 문제와 거의 동일한 문제로 strcpy 취약점을 이용한 bof 문제이다. LOB, gremlin -> cobolt 문제 풀이 gdb로 main문을 먼저 확인해본 결과 0x10을 할당하고 있으므로 dummy는 없는 것 같다. 따라서 스택 상황은 아래와 같다. buffer SFP RET 16 4 4 환경변수에 쉘코드와 nop을 100정도 주어 저장한 다음, 환경변수 주소를 알아낸다. LOB, gremlin -> cobolt 익스플로잇 환경변수 주소를 RET에 덮어주기만 하면 되기 때문에 앞단에 dummy값은 20바이트를 채워주면, 다음 단계로 가는 패스워드를 얻을 수 있게된다.
LOB, cobolt -> goblin 문제 확인 앞에 두문제와 거의 유사한 문제이지만 scanf 취약점에서 gets 취약점을 활용해서 bof를 해야한다는 점만 변경되었다. gets 함수는 사용자에게 입력받는 값의 길이를 체크하지 않기 때문에 bof에 취약한 함수이다. LOB, cobolt -> goblin 풀이 gdb로 main문을 살펴보니 총 0x10바이트(16)를 할당하는 것으로 보아 dummy 값은 없는 것으로 보인다. 따라서 스택 상황은 아래와 같다. buffer (16) SFP (4) RET (4) 먼저 앞단에 nop이 100정도 들어가있는 쉘코드를 환경변수에 올려준 후 주소값을 구해준다. LOB, cobolt -> goblin 익스플로잇 그리고 RET에 환경변수 주소 4바이트만 덮으면 되기 ..
해커스쿨의 Lord Of Bufferoverflow(LOB) 는 여러 bof 문제를 경험할 수 있는 환경?으로 보통 FTZ를 끝마쳤으면 LOB를 풀게된다. 2017년도에 풀고 블로그에 풀이를 올렸었는데 블로그를 여기로 이전하는 바람에 다시 작성하게 되었다. 초기설정 초기설정을 해놓치 않고 시작하면 엄청난 삽질을 경험할 수 있다. 난 링크(LOB 다운로드 & 초기설정)를 참고해서 초기설정을 진행해주었다. 초기설정은 아래와 같이 /etc/passwd의 bash를 전부 bash2로 변경하는 작업이다. 그다음 IP주소를 확인해주고 XShell이든 Putty든 연결해준다. 난 앞으로 XShell을 사용해서 문제풀이를 진행하도록 하겠다. LOB, gate -> gremlin 문제 확인 gate -> gremlin ..
* 단축키는 한글/영문 대소문자로 이용 가능하며, 티스토리 기본 도메인에서만 동작합니다.