본문 바로가기

System Hacking/vortex

overthewire :: Vortex level1 by ORANG


먼저 스택의 구조를 그려보면

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()를 한번 더 실행시키겠습니다.

는 성공!!