[LOB] darkelf -> orge
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 | #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); } // 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(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); } | cs |
1) egghunter 환경변수를 못씀
2) argv[1][47] 에 \xbf가 없으면 종료(ret 주소) -> 스택 내에 쉘코드를 써야한다는 것을 뜻합
3) buffer hunter 버퍼를 비움 -> 버퍼내에 쉘코드 쓰기불가
4) argv[1](첫번째 인자) 길이를 48로 제한
5) argv[0] 길이 77이 되어야함
argv[0]은 프로그램을 호출하는 데 사용하는 명령이 저장되는데,
argv[0]의 길이가 77이 아니면 프로그램을 종료한다
프로그램의 경로를 늘려 77로 맞추는데에 두 가지 방법이 있다
./orge [전달할 인자] 이렇게 실행하면 argv[0]에 6이 들어가게 되는데, 스크립트를 써서
.////////////////////////...../////////////orge [인자]
이런식으로 '/'를 72개를 채워 77자를 맞추면 argv[0] error 분기점을 무사히 넘어가 stack is still your friend가 나온다.
또 다른 방법은 심볼릭링크를 생성해 파일명을 77자로 맞추는것이다
성공적으로 넘어가 stack is still your friend이 떴다
나머지는 전레벨과 똑같다
arge.c 소스를 argv[1]의 주소를 출력하게 바꿔서 argv[1]의 주소를 구하고
페이로드와 Password
'System > LOB' 카테고리의 다른 글
[LOB] troll -> vampire (0) | 2015.04.01 |
---|---|
[LOB] orge -> troll (0) | 2015.04.01 |
[LOB] wolfman -> darkelf (0) | 2015.03.25 |
[LOB] orc -> wolfman (0) | 2015.03.24 |
[LOB] goblin -> orc (0) | 2015.03.21 |