[LOB] wolfman -> darkelf
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 | #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); } //chek 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로 제한
argv[1]의 길이를 48까지 줄 수 있게 제약이 추가되었지만
전단계에서도 buffer[40] + sfp[4] + ret[4] 딱 48까지 인자를 전달했기 때문에 있으나마나한 제약이다,
argv[1]의 주소를 구해 전레벨의 페이로드를 그대로 갖다쓰면된다.
페이로드와 Password
'System > LOB' 카테고리의 다른 글
[LOB] orge -> troll (0) | 2015.04.01 |
---|---|
[LOB] darkelf -> orge (0) | 2015.03.31 |
[LOB] orc -> wolfman (0) | 2015.03.24 |
[LOB] goblin -> orc (0) | 2015.03.21 |
[LOB] cobolt -> goblin (0) | 2015.03.20 |