[LOB] orc -> wolfman
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 | #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); } strcpy(buffer, argv[1]); printf("%s\n", buffer); // buffer hunter memset(buffer, 0, 40); } |
전레벨과 같은 소스에서 buffer hunter가 추가되어 버퍼를 비운다.
1) egghunter 환경변수를 못씀
2) argv[1][47] 에 \xbf가 없으면 종료(ret 주소) -> 스택 내에 쉘코드를 써야한다는 것을 뜻합
3) buffer hunter 버퍼를 비움 -> 버퍼내에 쉘코드 쓰기불가
strcpy함수를 보자
argv[1], 즉 프로그램에서 받은 인자를 buffer에 복사한다면 argv[1]의 주소에도 인자가 쓰여져 있으므로 buffer hunter 때문에 ret에 buffer의 주소를 덮지 못한다면 argv[1]의 주소를 덮으면 된다.
printf("%s\n",buffer);를 printf("%p"\n",argv[1]);로 바꾸고 argv[1]의 주소를 알아내 ret에 덮어쓰면 끝
전레벨과 동일하지만 ret에 argv[1]의 주소를 덮는다는 것이 차이점이다
페이로드와 Password
'System > LOB' 카테고리의 다른 글
[LOB] darkelf -> orge (0) | 2015.03.31 |
---|---|
[LOB] wolfman -> darkelf (0) | 2015.03.25 |
[LOB] goblin -> orc (0) | 2015.03.21 |
[LOB] cobolt -> goblin (0) | 2015.03.20 |
[LOB] gremlin -> cobolt (0) | 2015.03.18 |