[LOB] orge -> troll
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 | #include <stdio.h> #include <stdlib.h> 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(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); // one more! memset(argv[1], 0, strlen(argv[1])); } | cs |
1) egghunter 환경변수를 못씀
2) argv[1][47] 에 \xbf가 없으면 종료(ret 주소) -> 스택 내에 쉘코드를 써야한다는 것을 뜻합
3) buffer hunter 버퍼를 비움 -> 버퍼내에 쉘코드 쓰기불가
4) argv[1](첫번째 인자) 길이를 48로 제한
5) 인자 두개(argv[0],argv[1]) 제한 -> argv[2]를 이용한 익스플로잇 불가
6) argv[1] 를 비움
버퍼도 막히고 argv[1]도 막혔으니 심볼릭링크와 argv[0]를 이용하자
전레벨에서는 길이만 77로 맞추면 됐었으나 이번엔 쉘코드를 써야 한다
이번엔 좀 다른 쉘코드를 쓰는데 \x2f가 없는 쉘코드이다(48bytes)
\x2f는 '/' 를 의미하는데 심볼릭링크를 생성할 때 /는 경로를 의미하기 때문에 심볼릭링크 생성이 안되므로 다음 쉘코드를 쓴다
\xeb\x11\x5e\x31\xc9\xb1\x32\x80\x6c\x0e\xff\x01\x80\xe9\x01\x75\xf6\xeb\x05\xe8\xea\xff\xff\xff\x32\xc1\x51\x69\x30\x30\x74\x69\x69\x30\x63\x6a\x6f\x8a\xe4\x51\x54\x8a\xe2\x9a\xb1\x0c\xce\x81
troll.c 소스를 tro11.c로 복사해 버퍼를 출력하는 부분을 argv[0]의 주소를 출력하게 수정하고 tro11로 컴파일한다
tro11에 대한 심볼릭 링크의 파일명을 쉘코드로 하고 심볼릭링크를 실행하면 argv[0]의 주소인 bffffbb4가 나온다
같은방법으로 troll에 대한 심볼릭링크를 만들어 ret 주소를 bffffbb4로 페이로드를 짜면된다
페이로드와 Password
'System > LOB' 카테고리의 다른 글
[LOB] vampire -> skeleton (0) | 2015.04.01 |
---|---|
[LOB] troll -> vampire (0) | 2015.04.01 |
[LOB] darkelf -> orge (0) | 2015.03.31 |
[LOB] wolfman -> darkelf (0) | 2015.03.25 |
[LOB] orc -> wolfman (0) | 2015.03.24 |