level17 --- king poetic
우선 level17의 디렉터리를 확인한다.
attackme라는 의심스러운 파일이 존재한다. attackme는 level18의 권한을 가지고 있고, setuid가 걸려있는 파일이다.
우리가 공격할 대상이 attackme일 가능성이 크다고 생각하고 hint를 보자.
일반적인 실행이라면 사용자로부터 입력을 받고 level18의 권한으로 call() 함수를 실행할 것이다.
call() 함수는 단순히 "Hello there!"을 출력하는 함수이다.
level16과 달리 이번 소스는 shell을 띄우는 함수가 존재하지 않는다.
따라서 우리가 쉘 코드를 작성하여 printit() 함수의 주소에 쉘 코드의 주소를 써야한다.
우선 gdb를 통해 dummy가 있는지 없는지 분석해야한다.
int crap(4 byte), void *(call) (4 byte), char buf[20](20 byte)를 통해 총 0x1C(28 byte)가 할당된다고 예상할 수 있다.
하지만 gdb를 통해 분석해보면 0x38(56 byte)가 할당되었음을 확인할 수 있다.
28 byte의 dummy가 gcc에 의해 생성된 것이다.
dummy가 어디부분에 얼마만큼 삽입되었는지 확인하기 위해 아래 소스를 보자.
소스코드는 아래와 같다.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 | #include <stdio.h> void printit() { printf("Hello there!\n"); } main() { int crap; void (*call)()=printit; char buf[20]; fgets(buf,48,stdin); setreuid(3098,3098); call(); printf(" Input is : %s\n &buf : %p\n &call: %p\n &crap: %p\n", buf, buf, &call, &crap); } | cs |
위 소스로 얻은 정보를 바탕으로 메모리 구조를 그려보면 아래와 같이 그릴 수 있다.
지금까지 얻은 정보를 바탕으로 attackme 공격을 진행하자.
필자는 쉘코드를 환경변수에 등록하고 *call()의 함수의 주소를 환경변수로 지정하여 쉘을 실행할 것이다.
40 byte의 dummy + 쉘코드가 등록된 환경변수의 주소를 이용해 공격하자
'Wargame > FTZ' 카테고리의 다른 글
해커스쿨 FTZ level19 (Return To Libc) (0) | 2018.08.05 |
---|---|
해커스쿨 FTZ level18 (0) | 2018.08.05 |
해커스쿨 FTZ level16 (0) | 2018.08.04 |
해커스쿨 FTZ level15 (0) | 2018.08.04 |
해커스쿨 FTZ level14 (0) | 2018.08.02 |