이 포스팅은 서적 '윈도우 시스템 해킹 가이드 : 버그헌팅과 익스플로잇'을 기반으로 작성한 포스팅입니다.
쉘코드(Shellcode)
쉘코드란 보안 취약점이 있는(실행흐름을 악의적으로 조작할 수 있는) 프로그램에서 실행 시킬 실질적인 실행 코드를 말한다.
예를들어 이는 포트를 여는 것 일 수도 있고, 악의적인 서버에 본인의 개인정보 파일을 업로드하게 하는 것 일 수 도있으며,
해커가 원하는 실질적인 모든 행동을 수행하는 코드를 말한다.
보안 취약점이 있는 프로그램의 공격에 성공하여 실행흐름을 조작하여 공격자가 원하는 특정주소를 실행시킬 수 있는 데
이때 CPU는 흐름이 바뀐 메모리에서 직접 코드를 읽기에 CPU가 해석할 수 있는 기계어 코드로 이뤄져야한다.
좋은 쉘코드의 조건
신뢰성 - 공격자가 원하는 행위를 정확히 수행할 수 있어야 하며 문제가 없는 코드이여야 한다.
범용성 - 환경이 다른 시스템에서도 적용 가능 할 수 있게 작성되어야 한다.
실습
환경 : Windows 7 Ultimate K 32bit, Microsoft Visual Studio
먼저 쉘코드를 작성하기 위한 프로젝트를 하나 생성해줍니다.
쉘코드가 수행할 명령을 프로그래밍 해줍니다.
위 예시는 간단하게 계산기를 띄우는 프로그램을 작성하였습니다.
적절한 곳에 브레이크 포인트를 설정하여 준 후
F5를 눌러 디버그 모드로 진입합니다.
추가적으로 [마우스 오른쪽] - [디스어셈블리로 이동(D)]를 클릭하여
디스어셈블리 창을 열어줍니다.
필요한 곳에서 어셈블리어를 추출하여 준 후, 필요한 곳을 더하거나 빼주어 어셈블리어로 다시 프로그래밍 하여 줍니다.
허나 여기서 눈여겨 볼 점이 있습니다.
0x7762f336 : WinExec함수에 해당하는 주소
0x775fbdba : ExitProcess함수에 해당하는 주소
위와 같은 함수의 주소들은 어떻게 구하였는지 의문이 듭니다.
여러가지 방법이 있겠지만 구체적인 방법은 뒤로 미루고
원리를 설명하자면 직접적으로 kernel32.dll이 로드된 주소를 통해 각 함수를 구한 것 입니다.
허나 Windows7 버전이후 부터는 재부팅 될때마다 kernel32.dll이 로드되는 주소가 바뀌므로 각 함수의 주소값도 바뀝니다. (보안기법 : ASLR 적용)
이는 앞에서 설명한 좋은 쉘코드의 조건 ②범용성에 만족하지 않습니다.
이를 우회하는 방법은 추후에 설명하기로하고 현재의 원리에만 집중하겠습니다.
다시 프로그래밍 하여준 어셈블리코드에 브레이크 포인트를 걸고난 후, 다시 디버거모드를 실행합니다.
디스어셈블리 창에 진입하여
[마우스 오른쪽] - [코드 바이트 표시(Y)] 는 켜주고
[마우스 오른쪽] - [주소 표시(A)] 는 꺼줍니다.
그럼 위와 같은 형태의 디스어셈블리 창이 보일텐데,
위에서 필요한 부분을 복사하여 메모장에 작성한 뒤,
바이트코드(네모박스 부분)을 제외한 나머지를 모두 삭제합니다.
위와 같이 바이트 코드만을 추출하여 줍니다.
추출한 바이트 코드를 문자열에 담아줍니다.
그 후 쉘코드가 정상동작 하는지 테스트 실행하기 전에
[프로젝트] > [속성] > [링커] > [고급] > [DEP(데이터 실행 방지)]
위와 같은 보안 속성을 꺼줍니다.
데이터 실행 방지(DEP)는 스택, 힙 등의 메모리상에서 코드가 실행되는 것을 방지하는 것으로 버퍼오버플로우 등을 통한 공격을 방어하기 위해
적용된 보안 기법입니다.
정상적으로 실행이 완료되는 것을 확인할 수 있습니다.
결론으로써 위와 같은 원리로 쉘코드를 작성할 수 있게됩니다.
고찰
위 실습에서 간과한 점이 한가지 있습니다.
작성한 쉘 바이트 코드를 확인하면
'0x00'이라는 널바이트가 삽입되어 있는 것을 확인할 수 있습니다.
만약 취약한 부분이 문자열 복사 계열의 함수라면 널바이트를 문자열의 마지막으로 인식하여 널바이트 이후의 쉘코드는 복사할 수 없습니다.
이는 앞서 제시했던 신뢰성에 문제가 있는 쉘코드 입니다.
이를 위한 해결방안은 추후 포스팅 하겠습니다.
'IT > 시스템 해킹(System Hacking)' 카테고리의 다른 글
쉘코드 인코딩(Shellcode Encoding) (0) | 2017.11.11 |
---|---|
메타스플로잇(Metasploit)을 이용한 쉘코드 작성 (0) | 2017.11.10 |
범용 쉘코드(Universal Shellcode) (2) (1) | 2017.11.07 |
범용 쉘코드(Universal Shellcode) (1) (0) | 2017.11.06 |
쉘코드(Shellcode) 기초(2) (0) | 2017.11.05 |