본문 바로가기

IT/시스템 해킹(System Hacking)

쉘코드 인코딩(Shellcode Encoding)


이 포스팅은 서적 '윈도우 시스템 해킹 가이드 : 버그헌팅과 익스플로잇'을 기반으로 작성한 포스팅입니다.





관련 포스팅 보러가기


쉘코드(Shellcode) 기초(1)

쉘코드(Shellcode) 기초(2)

범용 쉘코드(Universal Shellcode) (1)

범용 쉘코드(Universal Shellcode) (2)

메타스플로잇(Metasploit)을 이용한 쉘코드작성



쉘코드르 작성하는 방법을 포스팅을 다뤘었는데, 한가지 유의할 점이 있다.


실제 쉘코드를 작성하고 공격했을 경우 쉘코드가 정상적임에도 불구하고 이상하게 공격이 실행되지 않는 경우가 있다.



우리가 입력한 값을 프로그램 내부에서 처리하는 과정 중에 대문자가 소문자로 변환되기도 하고, 소문자가 대문자로 변하기도 하며, 

유니코드로 변환되며 쉘코드 중간에 널바이트가 삽입되기도 하기 때문이다.


또한 문자열 복사 계열함수에서 발생하는 취약점일 경우 널바이트를 쉘코드로 이용한다면, 문자열의 끝으로 인식하여 더이상 

복사를 수행하지 않기에 공격에 실패하기도 한다.


이렇게 Exploit을 성공시키기 위해 쉘코드에서 반드시 제외되어야 하는 문자열을 bad char라고 부르며, 이러한 bad char를 제거하기 위한 방법으로 쉘코드 

인코딩을 이용하게 된다.


이는 이전 포스팅 쉘코드(Shellcode) 기초(2)에서 다룬 문제와 동일하다.



그런데 우리가 사용했던 메타스플로잇(Metasploit)에서 이러한 쉘코드 인코딩 또한 제공하니


실제 메타스플로잇을 이용한 쉘코드 인코딩을 해보겠다.



 실습



칼리 리눅스를 부팅한 후,


다음과 같은 명령어를 내리면 된다.


이때 


-b 옵션을 통해 제외할 bad char를 위 예시와 같이 지정해줄 수 있다.


-e 옵션은 인코더를 선택해주는 것이다. 인코더에는 여러가지 종류가 있는 데 위 예시에서는 shikata_ga_nai인코더를 사용하였다.





작성한 쉘코드를 기반으로 컴파일 후 빌드 해보자.





정상적으로 실행 완료된 모습을 확인할 수 있다.