먼저 스택의 구조를 그려보면
ptr이 buf[256]의 주소를 가리킵니다.
이후 소스를 보면..
while((x = getchar()) != EOF) { switch(x) { case '\n': print(buf, sizeof(buf)); continue; break; case '\\': ptr--; break; default: e(); if(ptr > buf + sizeof(buf)) continue; ptr++[0] = x; break; } } |
이 부분을 통해 ptr의 값을 조절할 수 있겠네요
'\\' 을 입력할 때마다 ptr-- 이고 ,
default의 ptr++[0]=x; 부분을 통해 메모리 입력이 가능하네요
#define e(); if(((unsigned int)ptr & 0xff000000)==0xca000000) { setresuid(geteuid(), geteuid(), geteuid()); execlp("/bin/sh", "sh", "-i", NULL); } |
또, ptr의 값을 변조한다면 이부분을 통해 쉘을 띄울 수 있습니다
0xffffd51c -> buf 의 시작 주소
0xffffd514 -> ptr 의 시작 주소
buf와 ptr 사이에 4바이트 만큼 dummy가 존재하므로,
ptr이 가리키는 주소값( buf[256] )으로부터 -264 에 ptr이 존재하겠네요
리틀 에디안 방식임을 고려해서, -261에 '\xca' 으로 덮어준후 e()를 한번 더 실행시키겠습니다.
는 성공!!
'System Hacking > vortex' 카테고리의 다른 글
overthewire :: Vortex level5 by ORANG (0) | 2014.10.23 |
---|---|
overthewire :: Vortex level4 by ORANG (0) | 2014.10.20 |
overthewire :: Vortex level3 by ORANG (0) | 2014.10.20 |
overthewire :: Vortex level2 by ORANG (0) | 2014.10.20 |
overthewire :: Vortex level0 by ORANG (0) | 2014.10.20 |