아래는 C언어 소스다.
이전 문제와 다른점은 argv[1]의 길이를 체크한다는 것이다. argv[1]의 길이가 48을 넘기면 if문에 들어가게 되고 종료하게 된다.
이 부분을 우회해야한다.
우회방법은 간단하다. argv[2]에 쉘코드를 넣으면 buffer에 이어지게 값을 넣을 수 있다.
argv[1]과 argv[2]는 " "(공백)으로 구분하니 44바이트 뒤에 공백을 추가해서 argv[2]에 값을 넣어주면 된다.
/* The Lord of the BOF : The Fellowship of the BOF - darkelf - egghunter + buffer hunter + check length of argv[1] */ #include <stdio.h> #include <stdlib.h> 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"); exit(0); } // check the length of argument if(strlen(argv[1]) > 48){ printf("argument is too long!\n"); exit(0); } strcpy(buffer, argv[1]); printf("%s\n", buffer); // buffer hunter memset(buffer, 0, 40); }
'Wargame > lord of bufferoverflow' 카테고리의 다른 글
Lord of bufferoverflow orge (0) | 2017.08.18 |
---|---|
Lord of bufferoverflow darkelf (0) | 2017.08.17 |
Lord of bufferoverflow orc (0) | 2017.08.17 |
Lord of bufferoverflow goblin (0) | 2017.08.16 |
Lord of bufferoverflow cobolt (0) | 2017.08.16 |