SYSTEM/bof
LEVEL6 (wolfman -> darkelf) : check length of argv[1] + egghunter + bufferhunter
Notchicken
2013. 7. 19. 13:25
darkelf.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);
}
// 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);
}
darkelf는 argv[1]의 길이가 48이하여야 했다.
어차피 지금까지 argv[1]의 길이가 48이 넘은적이 없으므로 똑같이 공격을 했다.
wolfman.c 때와 똑같이 공격했다.
우선 argv[2]의 주소를 찾고,
buffer와 SFP를 \x90으로 채우고 ret에 argv[2]의 주소를 넣은 후, argv[2]에 쉘코드를 넣어 공격했다.