이 포스팅은 서적 '윈도우 시스템 해킹 가이드 : 버그헌팅과 익스플로잇'을 기반으로 작성한 포스팅입니다.
현 포스팅[범용 쉘코드(Universal Shellcode)]을 읽기에 앞서 제시된 포스팅을 읽고 오시는 것을 추천드립니다.
이전 포스팅
범용 쉘코드(Universal Shellcode)의 필요성
이전 포스팅[ 쉘코드(Shellcode) 기초(1) ]에서 작성한 쉘코드를
컴퓨터를 재부팅한 후 실행하면 어떻게 될까?
다음과 같은 에러 메세지를 확인할 수 있다.
그렇다면 다음과 같이 재부팅전에 정상작동하던 쉘코드가
어떠한 부분에서 문제가 발생하며
어떠한 이유로 정상적으로 실행이 되지 않는 것인지
짚고 넘어가야 한다.
위의 작성한 쉘코드에서 우리는 두가지 함수를 호출하여 계산기 프로그램을 실행하였다.
두가지 함수는 WinExec함수와 ExitProcess함수였다.
구체적으로 일컫진 않았지만 두 함수의 주소를 구하여 하드코딩하여 작성해 놓았다.
각 함수의 주소값이 사용되는 어셈블리 코드는
mov eax, 0x7762f336
mov eax, 0x775fbdba
이 두 부분이였다.
이 두 부분에 해당하는 바이트 코드를
하드코딩하여 작성해놓았다.
그렇다면 하드코딩된 부분이 정상적으로 동작하지 않는 구체적인 이유는 무엇일까?
답은
Windows 7 버전이후로 ASLR( Address Space Layout Randomization)이란 보안 기법이 적용되어있다.
'ASLR'이란 이름에서 확인할 수 있듯이
컴퓨터가 재부팅 시마다 실행되는 코드의 주소가 무작위적(Random)으로 하게 메모리에 올라가는 보안 기법이다.
그러한 이유로 하드코딩된 함수의 주소는 재부팅시에 당연히 변경되었을 것이며
정상적으로 실행할수 없는 것이다.
그럼 이전 포스팅[쉘코드(Shellcode) 기초(1)]에서 구체적으로 언급하진 않았지만
파이썬 스크립트를 작성하여 함수주소를 구해왔었다.
다시한번 스크립트를 이용해 주소를 구해보면
다음과 같은 주소가 나오고 이를 다시 한번 하드코딩 해본후
컴파일 후 실행시켰을 때
정상적으로 실행됨을 확인할 수 있다.
그렇다면 해결책은
쉘코드를 만들 때 방금 스크립트를 이용해 함수의 주소를 구해왔던 것처럼
동적으로 함수의 주소를 구해오는 부분까지 쉘코드로 만들면 더욱 범용성이 뛰어난 쉘코드를 만들 수 있는 것이다.
다음 포스팅에서는 구체적으로 어떠한 규칙으로 함수의 주소값을 구할 수 있으며, 실제로 구하는 과정을 실습을 통해 알아보겠다.
'IT > 시스템 해킹(System Hacking)' 카테고리의 다른 글
쉘코드 인코딩(Shellcode Encoding) (0) | 2017.11.11 |
---|---|
메타스플로잇(Metasploit)을 이용한 쉘코드 작성 (0) | 2017.11.10 |
범용 쉘코드(Universal Shellcode) (2) (1) | 2017.11.07 |
쉘코드(Shellcode) 기초(2) (0) | 2017.11.05 |
쉘코드(Shellcode) 기초(1) (3) | 2017.11.05 |