해킹 분야에서 상대 시스템을 공격하는 것을 익스플로잇(Exploit)이라고 부릅니다. 익스플로잇은 ‘부당하게 이용하다’라는 뜻이 있는데, 상대 시스템에 침투하여 시스템을 악용하는 해킹과 맥락이 닿습니다.
이 로드맵에서는 시스템 해킹의 익스플로잇과 관련된 총 9가지 공격기법을 소개해 드릴 것입니다. 각각은 공격기법이 태그로 달려있습니다. 이 강의에서는 그중에서 첫 번째 공격기법으로 셸코드를 소개하겠습니다. 이제까지 배웠던 배경 지식을 점검하고, gdb 사용에 익숙해지는 기회가 되시길 바랍니다
**셸코드(Shellcode)**는 익스플로잇을 위해 제작된 어셈블리 코드 조각을 일컫습니다. 일반적으로 셸을 획득하기 위한 목적으로 셸코드를 사용해서, 특별히 “셸”이 접두사로 붙었습니다. 셸을 획득하는 것은 시스템 해킹의 관점에서 매우 중요한데, 그 이유는 execve 셸 코드 에서 살펴보겠습니다.
만약 해커가 rip를 자신이 작성한 셸코드로 옮길 수 있으면 해커는 원하는 어셈블리 코드가 실행되게 할 수 있습니다. 어셈블리어는 기계어와 거의 일대일 대응되므로 사실상 원하는 모든 명령을 CPU에 내릴 수 있게 됩니다.
셸코드는 어셈블리어로 구성되므로 공격을 수행할 대상 아키텍처와 운영체제에 따라, 그리고 셸코드의 목적에 따라 다르게 작성됩니다. 아키텍처별로 자주 사용되는 셸코드를 모아서 공유하는 사이트도 있습니다. 그러나 공유되는 셸코드는 범용적으로 작성된 것이기 때문에, 실행될 때의 메모리 상태 같은 시스템 환경을 완전히 반영하지는 못합니다. 따라서 최적의 셸코드는 일반적으로 직접 작성해야 하며, 상황에 따라 반드시 그래야만 할 수도 있습니다. 셸코드를 공유하는 서비스가 있다는 사실은 알고계시돼, 이런 상황을 대비하여 언제든 스스로 작성할 수 있어야 합니다.
이번 강의에서는 파일 읽고 쓰기(open-read-write, orw), **셸 획득(execve)**과 관련된 셸코드를 작성해보고, 직접 디버깅하며 동작을 관찰해보겠습니다.