시험기간이라서 오랫만에 포스팅하는거같네요 아직 시험이 남앗지만 뭔가 보안 공부에 소홀해지는거같아서 오늘 새벽까지는 보안 공부에 투자하겠습니다 

상당히 많이 햇갈리고 고민했습니다 

좀 더 많은 자료를 읽고 초보 수준에서 얼른 벗어나야겠다고 생각이드는 문제입니다.

*이 글은 초보자가 작성한 글이며 매우 지식이 부족합니다 .혹시나 정확하지 않은 지식을 받아가실 수 있으니 RTL 기법은 직접 공부하시길 바랍니다. *


먼저 힌트를 읽어보겠습니다! 

권한 상승을 시키는 문제네요 

3093은 레벨13의 권한을 의미합니다 

gets함수의 취약점을 이용해서 공격해야하는데요 

gets 함수의 취약점은 엔터를 입력받을 때까지 모두 문자열로 인식하고 버퍼에 담습니다 고로 버퍼의 크기보다 길게 입력해도 엔터를 받을때까지 무조건 스택에 담아버리는군요 

 gdb를 하기위해서 저 코드를 쓰기권한이 존재하는 tmp에 복사해왔습니다

그 후 gdb로 열었습니다 

main+3 부분을 보면 스택에 0x108을 만드네요 264의 크기입니다 이제 저희는 

buf(264) | sfp (4) | ret (4) | argc(4) | argv(4) 대강 이렇게 만들면 되겠네요


자 system과 exit의 값을 먼저 출력했습니다 

왜 system과 exit의 값을 출력하냐면 . 

RTL 공격이란 간단하게 System 명령의 주소를 알아낸후 그 주소를 Return Address로 바꿔서 실행시키는 방법입니다.

이제 여기서 System 명령을 실행 시키기 위해서는 System 명령어가 필요하기 때문에 System 명령어의 주소값과 지금 실행중인 Process를 종료하기 위해서 exit명령어를 실행 시키기 위해서 exit의 주소 값을 가져왓고 그 후 sh shell을 실행시키기 위해서 sh 의 주소값을 가져와야 합니다! 

자 이제 system과 exit의 값을 출력햇는데 저 사진만 보시고는 sh의 주소값을 어떻게 출력해야하는지 감이 안잡히시지요 ?

/bin/sh의 주소를 구하는 file을 직접 만드셔야합니다 .


/bin/sh 의 주소를 구하는 코드입니다 .

자 그리고 여기서는 프로그램을 실행 후에 값을 받아들이기 때문에 

Python과 cat 명령어를 이용해서 풀어야합니다 .( | 이용해야함)





이런식으로 공격코드를 짯는데요 아까 초반부에 

buf(264) | sfp (4) | ret (4) | argc(4) | argv(4) 대강 이렇게 만들면 되겠네요 

라고 말씀을 드렷었지요 ? 

buf +sfp = A*268 
ret = system함수의 주소 
argc = exit의 주소 
argv = /bin/sh의 주소값입니다 .
저렇게 입력한 후 my -pass 를 해주시면 비밀번호가 나옵니다 !
고생하셨습니다


'해커스쿨 ftz' 카테고리의 다른 글

FTZ - LEVEL14  (0) 2016.04.24
FTZ - LEVEL13  (0) 2016.04.23
FTZ - LEVEL11  (0) 2016.04.15
FTZ - LEVEL 10  (0) 2016.04.15
FTZ - LEVEL9(gdb)  (0) 2016.04.10

+ Recent posts