본문으로 바로가기

해커스쿨 LOB gate 풀이, write-up

category Wargame/LOB 2018. 8. 9. 13:16

gate --- gate



우선 gate의 디렉토리를 확인한다.





gremlin이라는 의심스러운 파일이 존재한다. gremlin은 gremlin의 권한을 가지고 있과, setuid가 걸려있는 파일이다.


gremlin.c를 가지고 gremlin 파일을 만들었을 가능성이 있기 때문에 gremlin.c 파일을 본 뒤 어떤 취약점이 있는지 확인해보자.





배열이 하나 선언되어 있다. (char buffer[256])


우리는 gremlin을 실행할 때 1개의 인자를 전달해야한다. (if(argc<2))


1개의 인자를 buffer에 전달한 뒤 출력한다.



gremlin의 메모리 구조를 그려보면 아래와 같이 그려볼 수 있다.



하지만 실제 배열이 할달되면서 중간 중간에 gcc가 자동적으로 dummy를 생성할 수 있다.

따라서 정확한 크기를 알기 위해 gdb로 분석해보자.





dummy가 추가적으로 생성되지 않았음을 확인할 수 있다.



공격을 하는 방법은 크게 두가지가 있다.



1. 환경변수에 쉘코드를 등록하고 RET에 쉘코드의 환경변수 주소로 write 한다.



dummy[260](buffer + SFP) + RET 형태로 공격을 진행해야 한다.






2. buffer[256]이 쉘 코드를 write하기에 충분히 크기 때문에 buffer[256]에 쉘코드를 작성하고 RET을 버퍼의 주소로 write 한다.


25 byte의 쉘코드 = "\x31\xc0\x50\x68\x2f\x2f\x73\x68\x68\x2f\x62\x69\x6e\x89\xe3\x50\x53\x89\xe1\x89

\xc2\xb0\x0b\xcd\x80"


성공확률을 높이기 위해서 NOP 패딩을 진행할 것이다. 235 byte의 NOP padding이 필요하다.



235 byte의 NOP padding + 25 byte의 쉘코드 + buffer의 주소 로 공격코드를 작성할 것이다.


buffer의 주소를 일반적으로 gdb를 이용해서 buffer의 주소를 확인하려고 하겠지만 다음과 같이 어떠한 작업을 하려면 permission denied 된 것을 알 수 있다.





이런 상태를 해결할 수 있는 가장 쉬운 방법은 기존의 파일을 복사하는 것이다.

gremlin을 gremlincp로 복사하면 내용은 그대로 복사되면서 권한이 바뀌는 것을 확인할 수 있다.





이제 복사한 gremlincp를 가지고 분석한 뒤 gremlin에 공격을 진행하면 된다.





`perl -e 'print "A"x256'`을 이용해 인자를 넘기고 있다 0x41414141이 0xbffff948부터 시작하는것을 보아 buffer의 주소가 0xbffff948임을 알수 있다. 


buffer의 주소를 이용해 공격을 진행하자.



다음과 같이 쉘코드를 통해서 성공적으로 공격에 성공할 수 있다.