ipwn

[LOB(Lord Of Buffer overflow)] gate -> gremlin 본문

Write up/LOB

[LOB(Lord Of Buffer overflow)] gate -> gremlin

ipwn 2018. 1. 13. 22:59

LOB를 한 번 공략해보겠다. LOB는 aslr이 걸려있지 않으며 NX가 걸려있지 않다. 그리고 dummy값도 없다.


즉 return address를 shellcode address로 옮겨서 shellcode를 실행할 수 있다는 말이다.


또, 기본 쉘인 bash가 \x90(nop)를 \x00(NULL)으로 착각하는 오류를 발생시켜서 


bash2를 실행시켜주고 진행을 하는게 편하다. 서버 구축은 일단 생략하고 시작하도록 하겠다.


첫 단계는 gate단계이다. 그리고 password는 gate이다.



접속을 하고 파일들을 살펴보니 gremlin.c와 gremlin 파일이 있다. 한 번 소스코드를 보겠다.



일단 argv[1]에 값을 받아서 buffer에 복사를 해준다. 그런데, strcpy함수는 길이 제한없이 다 복사를 시켜버린다.


즉 buffer의 공간을 초과하여 복사시켜서 Stack Overflow를 발생시킬 수 있다.


그렇다면 buffer을 260byte(buffer + SFP)만큼 덮어주고 그 뒤에 4byte(return address)를 shellcode의 주소로 옮겨주면


간단히 shell이 실행될 것이다.


shellcode는 buffer의 맨 처음 부분에다가 적어주도록 하겠다. 그리고 shellcode는 41byte 길이의 shellcode를 사용하겠다.


그렇다면 우리가 넣어줘야 할 값은 shellcode + dummy*219 + &(buffer + 0)이 될 것이다.


일단 gremlin파일을 segmentation fault를 띄워서 core dump를 생성시켜보겠다.


그냥 gremlin 파일을 segmentation fault를 띄우는 것으로는 core dump가 생성되지 않으므로 


gremli1과 같이 파일의 이름의 길이가 똑같은 복사파일을 하나 생성해주어야 한다. 이름의 길이가 같지 않으면 


메모리 주소가 달라질 수 있기에 core dump를 본다한들 아무 의미가 없을 것이다.



이렇게 cp 명령어를 통해서 gremlin파일의 복사본인 gremli1파일을 생성했다.


이제 gremli1 파일을 통해 core dump를 생성해보겠다.



성공적으로 core 파일이 생성된 것을 확인할 수 있다. 이제 core파일을 gdb로 debugging해보겠다.



core파일을 debugging을 할 때는 -c 옵션을 주면 된다. 근데 너무 앞쪽을 확인했는지 buffer의 중간 부분이 뜬다.


좀 더 이전의 메모리값을 확인해보겠다.



바로 buffer의 시작주소가 떴다. 0xbffff910 + 8의 값이 buffer의 주소였다. 간단히 계산해보면 0xbffff91c가 


buffer의 시작 주소임을 알 수 있다. 이제 exploit이 가능해졌다. buffer의 시작 부분에 shellcode(41byte)를 때려박고


dummy값을 219byte 만큼 준 뒤 return address에 0xbffff91c의 값을 little endian 형식으로 넣어주면 될 것이다.


즉 


`python -c 'print "\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" + "A"*219 + "\x1c\xf9\xff\xbf"'`


가 우리가 원하는 shell을 가져와주는 payload라고 말할 수 있겠다. 한 번 제대로 작동하는지 


payload를 gremli1파일에 넣어보겠다.



성공적으로 shell이 가져와진 것을 확인할 수 있다. 이제 이 payload를 gremlin에 넣어서 권한이 상승한 shell을 가져와보자.



성공적으로 권한이 상승된 shell을 가져온 것을 확인할 수 있다. gremlin level로 넘어가는 password는 hello bof world이다.


Comments