티스토리 뷰
wolfman.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);
// buffer hunter
memset(buffer, 0, 40);
}
wolfman은 orc처럼 환경변수의 메모리를 비우고 argv[1][47]의 값이 \xbf여야 하면서 buffer의 메모리를 비웠다.
쉘 코드를 어디에 넣을지 생각하다 argv[2]에 쉘 코드를 넣고 ret에 argv[2]의 주소를 넣어 공격해보기로 했다.
우선, argv[2]의 주소를 찾아보았다.
argv[1]에 buffer와 SFP에 nop를 채우고 if조건을 채우기 위해 ret는 \xbf를 채운다.
그 다음 argv[2]에 perl을 이용해 쉘 코드를 넣는다.
argv[2]의 주소 : bffffc57
그 다음 argv[1]의 ret에 argv[2]의 주소인 bffffc57를 넣어 공격한다.
'SYSTEM > bof' 카테고리의 다른 글
LEVEL7 (darkelf -> orge) : check argv[0] (0) | 2013.07.19 |
---|---|
LEVEL6 (wolfman -> darkelf) : check length of argv[1] + egghunter + bufferhunter (0) | 2013.07.19 |
LEVEL4 (goblin -> orc) : egghunter (0) | 2013.07.19 |
LEVEL3 (cobolt -> goblin) : small buffer + stdin (0) | 2013.07.19 |
LEVEL2 (gremlin -> cobolt) : small buffer (0) | 2013.07.19 |
- Total
- Today
- Yesterday