2018. 8. 10. 19:55ㆍWarGame/exploit-exercises.com-fusion
맞습니다.. 다음과제는 exploit-exercise funsion이였습니다 :)
lob와 비슷해보이는데 조금더 리얼한 코드같습니다.
코드를 먼저확인하죠.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 | #include "../common/common.c" int fix_path(char *path) { char resolved[128]; if(realpath(path, resolved) == NULL) return 1; // can't access path. will error trying to open //취약점 각 becuase memcmp strcpy(path, resolved); } char *parse_http_request() { char buffer[1024]; char *path; char *q; // printf("[debug] buffer is at 0x%08x :-)\n", buffer); :D if(read(0, buffer, sizeof(buffer)) <= 0) errx(0, "Failed to read from remote host"); if(memcmp(buffer, "GET ", 4) != 0) errx(0, "Not a GET request"); path = &buffer[4]; q = strchr(path, ' '); if(! q) errx(0, "No protocol version specified"); *q++ = 0; if(strncmp(q, "HTTP/1.1", 8) != 0) errx(0, "Invalid protocol"); fix_path(path); printf("trying to access %s\n", path); return path; } int main(int argc, char **argv, char **envp) { int fd; char *p; background_process(NAME, UID, GID); fd = serve_forever(PORT); set_io(fd); parse_http_request(); } | cs |
저기 realpath가 취약점인 것 같습니다 왜냐하면 상대경로를 절대경로로 바꾸어주는 함수라고 나와있는데 그 과정에서 memcmp가 들어가기때문에 bof가 일어날 가능성이 큽니다.
코드를 조금더 살펴보면 맞춰줘야할 조건이 2개가 있습니다.
1. payload안에 "GET "이 들어가야한다
2. payload안에 "GET " 후에 " HTTP/1.1 "이 들어가야한다 입니다.
페이로드는 생각보다 간단해 보입니다.
"GET " + dummy[n] + ret + " HTTP/1.1 " + nopsled + shellcode
저는 pwntools를 이용해서 payload를 작성하려고 합니다.
쉘코드는 단순한 쉘코드가아닌 리모트 쉘코드를 이용해야하고,
ret를 버퍼 + x로 하여서 뒷부분으로 바로 보내줍시다.
저희가 알아내야할 것들은 dummy의 갯수입니다.
노가다로 brutforce를 해도 상관은 없지만.. 그래도 구해봅시다 (grin)
lea -0x88, $eax이부분이 버퍼의 크기입니다.
0x88 = 136이고 sfp까지 덮어줘야하니 140byte입니다.
그래서 처음에는 dummy값을 140을 주었지만 쉘을 획득하지 못하였습니다.
오류를 찾아보니 realpath에는 절대경로니까 맨 앞에 "/"이 붙어서 1byte를 가져간다고 추론하고(몰라서 물어봤습니다 ㅎ)
더미를 139byte를 주었습니다.
페이로드입니다.
쉘을 얻었습니다 :)
'WarGame > exploit-exercises.com-fusion' 카테고리의 다른 글
exploit-exercise Fusion level-02 (0) | 2018.08.14 |
---|---|
exploit-exercise Fusion level-01 (0) | 2018.08.12 |