티스토리 뷰
orc.c
#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);
}
orc는 지금까지와 다르게 egghunter가 환경변수의 메모리값을 지우고, argv[1][47]의 값이 \xbf가 아니면 “stack is still your friend"를 출력하는 것이 있었다.
buffer를 nop와 쉘 코드로 채우고 SFP를 nop로 채운다음 ret에 buffer의 주소를 넣어 공격하기로 했다.
우선, orc.c를 복사하여 printf("%x\n", buffer);를 추가하여 buffer의 주소를 찾았다.
buffer 어딘가의 주소 : bffffac0
buffer의 주소를 알아내었으니 공격.
buffer의 앞(24byte)은 \x90으로 채운 뒤, 16byte의 쉘코드를 넣어 buffer의 40byte를 채운다. 그 다음 SFP를 \x90으로 채우고 찾은 buffer의 주소 \xc0\xfa\xff\xbf를 ret에 넣어 공격하였다.
'SYSTEM > bof' 카테고리의 다른 글
LEVEL6 (wolfman -> darkelf) : check length of argv[1] + egghunter + bufferhunter (0) | 2013.07.19 |
---|---|
LEVEL5 (orc -> wolfman) : egghunter + bufferhunter (0) | 2013.07.19 |
LEVEL3 (cobolt -> goblin) : small buffer + stdin (0) | 2013.07.19 |
LEVEL2 (gremlin -> cobolt) : small buffer (0) | 2013.07.19 |
LEVEL1 (gate -> gremlin) : simple bof (0) | 2012.11.23 |
- Total
- Today
- Yesterday