티스토리 뷰

Projects/Shellcode

[shellcode] 01. 쉘 코드?

hackability 2014. 6. 22. 16:10

최종 수정: 2014-06-22


안녕하세요. Hackability 입니다.


본 포스팅은 "쉘 코드 기초" 라는 주제로 쉘 코드가 어떤 녀석인지 간단히 정리해보겠습니다.


Exploit-DB (exploit-db.com)에서 Linux/x86 Reverse TCP Bind Shellcode (92 bytes)라는 내용은 다음과 같습니다.



보통 이런식으로 된 코드들이 많이 돌아 다니고 있는데, code의 내용이 shellcode의 내용을 담고 있습니다. 제목으로 추측컨데 리눅스 x86 시스템에서 Reverse TCP 동작을 하는 쉘 코드 인것 같습니다.


처음에 쉘 코드를 접했을 때 궁금했던점은 "왜 쉘 코드를 사용하는 것 일까?" 였고 두 번째는 "저 코드는 어떻게 만들어 지는 것 일까?" 였습니다.


먼저, 그림을 이용하여 익스플로잇을 통해 쉘 코드 까지 가는 과정을 한 번 보도록 하겠습니다.





간단히 프로그램이 실행된 후, 메모리 구조를 그린 내용입니다. 정상 흐름도의 경우 함수가 종료될 시, 리턴 주소를 가져와서 실햄 흐름을 적절한 프로그램 코드 영역으로 옮기게 됩니다.


하지만 문자열 버퍼 오버플로우 취약점이 있는 경우 비정상 흐름도 처럼 문자열 변수를 이용하여 리턴 주소를 담고 있는 공간을 덮어 쓰고 (+ 그 위에 쉘 코드 까지 올려 놓고) 함수가 종료될 시, 리턴 주소를 읽었을 때 정상 프로그램 코드 영역으로 가지 않고 공격자가 지정한 쉘 코드의 주소로 뛰게 되어 쉘 코드가 실행이 되게 됩니다.


익스플로잇 코드의 경우 프로그램 취약점을 이용하여 메모리에 쉘 코드를 써 놓고 프로그램의 흐름을 변경 시키기 위한 것으로 생각할 수 있고, 쉘 코드의 경우에는 익스플로잇이 성공했을 시, 공격자가 원하는 행위를 할 수 있는 공격 코드라고 생각할 수 있습니다.


우리가 생각하는 코드는 void go_attack()과 같은건데 왜 쉘코드에서는 무섭게 생긴 16진수 바이트 시퀀스로 이루어져 있을까요. 그 이유는 사람이 읽을 수 있는 void go_attack()의 형태가 아닌 컴퓨터가 읽을 수 있는 기계어 형태로 변경해야 하기 때문입니다.


결론적으로 쉘 코드는 공격자가 익스플로잇 코드를 이용하여 취약한 프로그램 공격에 성공하면 실행 제어권을 갖게 되는데 이 때 실제 공격자가 할 행위들이 정의된 곳이 쉘 코드로 볼 수 있습니다.


악성 코드의 경우, 쉘 코드에 수 많은 악성 행위들을 넣는 것이 아닌 (여러 가지 이유 떄문에) 웹에서 악성 코드를 다운 받고 실행 시키는 쉘 코드들이 들어 있습니다. 여기서는 실제 악성 행위가 다운받아 실행된 악성 프로그램에 의해서 동작이 되겠죠.


2편에서 간단한 리눅스 쉘 코드 작성으로 또 뵙겠습니다. :P

댓글