쉘코드 인코딩
이 글은 윈도우 시스템 해킹가이드 버그헌팅과 익스플로잇을 보고 정리한 글입니다.
다양한 쉘코드를 작성 해보았는데 어떠한 쉘코드를 작성할 때는 정상적인 쉘코드임에도 실제로 작동하지 않는 경우도 있다. 우리가 입력한 값들이 프로그램 내부에서 처리하는 과정에서 대문자 소문자가 바뀌거나 유니코드로 변환되거나, 중간에 널바이트가 삽입되기도 한다. 이러한 점 때문에 exploit을 성공시키기 위해서는 쉘코드에서 반드시 제거해야할 문자들이 있는데 이 문자열을 bad char이라고 부른다.
우리는 shellcode에서 이 bad char을 제거하기 위한 방법으로 쉘코드 인코딩을 사용한다.
bad char을 직접적으로 제거하고 싶으면 -b옵션을 이용하여 제거할 문자열을 지정해준다.
우리가 쉘코드를 얻기 위해 사용하던 msfvenom도 쉘코드 인코딩을 제공한다. 우리는 기본적인 shikata_ga_nai 인코더를 사용해 보겠다.
msfvenom -p windows/exec cmd=cmd -f c -e x86/shikata_ga_nai
자 이렇게 -e 옵션 뒤에 인코더를 지정해주면 그 인코더를 통해 인코딩 되어진 쉘코드가 나오는 것을 볼 수 있다. 위에 사진을 자세히보면 똑같은 cmd창을 부르는 쉘코드를 요청하는 명령어를 두번 쳤지만 서로 다른 쉘코드가 나온는 것을 볼 수 있다. 이것은 shikata_ga_nai인코더가 다형성을 지원하기 때문이다.
여러번 실행하다 보면 전혀 다른 패턴의 쉘코드가 생성되는게 확인되어진다. 이를 통해 단순 패턴 탐지 백신 및 IDS같은 보안 제품을 우회하여 공격할 수 있다.