LOB, ssassin -> zombie_assassin 문제 확인 저번 문제에서 달라진 점은 strcpy가 아닌, strncpy를 사용했다는 점이다. 따라서 저번문제처럼 RTL Chaning은 RET 영역 뒤까지 덮어야하기 때문에 사용하지 못한다. 힌트에 나와있는대로 FEBP를 사용해보자! FEBP에 대한 내용은 아래 포스팅에 따로 정리했고 여기서 구성한 페이로드를 그대로 본 문제에 적용해보도록 한다. FEBP(Fake EBP) 공격이란? FEBP(Fake EBP) 공격이란? LOB 풀이를 옮기다가 FEBP를 사용하는 문제가 나와서 여기에 정리한다. EBP를 조작해 원하는 코드가 실행되게끔 하면 되기 때문에 한가지 방식이 정해져있지는 않은 것 같다. /* 틀린 부분 지적 및 댓글 환영합니.. livey..
LOB 풀이를 옮기다가 FEBP를 사용하는 문제가 나와서 여기에 정리한다. EBP를 조작해 원하는 코드가 실행되게끔 하면 되기 때문에 한가지 방식이 정해져있지는 않은 것 같다. /* 틀린 부분 지적 및 댓글 환영합니다 */ FEBP 공격 페이로드 FEBP 공격을 위해 buffer에 &(shellcode)를, SFP에 &(buffer)-4를, RET에 &(leave-ret 가젯)을 넣어보고, 어떻게 쉘코드가 실행될 수 있는지 순서대로 확인해보자. buffer (44) &(shellcode) SFP
LOB, giant -> assassin 문제 확인 이번엔 힌트에도 주어져 있듯이, 리턴 부분에 스택주소 영역과 라이브러리주소 영역이 전부 막혔기 때문에 RTL을 사용하지 못한다. 이럴땐 리턴 가젯을 사용하면 된다. /* 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 error\n"); exit(0); } if(argv[1][47] == '\xbf') // 스택영역 막힘 { printf("stack retbayed you!\n"); exit(0..
LOB, bugbear -> giant 문제 확인 저번 문제에 이어 두번째 RTL 문제이다. 이번 문제는 리턴 주소가 execve 함수가 맞는지 조건문으로 확인하고 있기 때문에 system 함수가 아닌 execve를 사용해 쉘을 실행시켜야 한다. /* The Lord of the BOF : The Fellowship of the BOF - giant - RTL2 */ #include #include #include main(int argc, char *argv[]) { char buffer[40]; FILE *fp; char *lib_addr, *execve_offset, *execve_addr; char *ret; if(argc < 2){ printf("argv error\n"); exit(0); } ..
LOB, darknight -> bugbear 문제 확인 이번 문제는 RET을 덮는 주소에 \xbf 영역을 사용하지 못하게 해놓았는데 이 뜻은, 리턴 주소로 스택 영역을 사용하지 못하게 된 것이다. RTL을 활용하는 문제이다. RTL은 FTZ 19번 문제를 풀 때 쓰여야 했던 개념이라 따로 정리해서 포스팅한 적이 있으니 RTL 내용은 아래 포스팅을 참고하길 바란다. RTL(Return to Library) Chaining 이란? RTL(Return to Library) Chaining 이란? 역시 정리하지 않으면 잊어버리는 것이 사람인 것 같다. 나만 그럴수도... ROP 개념을 정리하는 와중에 먼저 RTL Chaning 부터 제대로 정리하자는 생각이 들어 여기에 정리한다. RTL(Return to Li..
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, orge-> troll 문제 확인 이전 문제에서 argv 수를 제한(argc == 2)하는 조건문이 추가되었다. /* 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 changed if(argc != 2){ printf("argc must be two!\n"); exit(0); } // egghunter for(i=0; environ[i]; i++) memset(environ[i], 0, strlen(e..
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..