본문 바로가기

IT/시스템 해킹(System Hacking)

쉘코드(Shellcode) 기초(2)


이 포스팅은 서적 '윈도우 시스템 해킹 가이드 : 버그헌팅과 익스플로잇'을 기반으로 작성한 포스팅입니다.





이전 포스팅

쉘코드(Shellcode) 기초(1) 보러가기






쉘코드(Shellcode) 기초(1)에서의 문제점


이전 포스팅[쉘코드(Shellcode) 기초(1)]에서 작성한 쉘 바이트 코드에서는 널바이트('0x00')을 포함한다는 문제점을 지니고 있었다.






바이트 코드에서 널바이트('0x00')를 포함할 시에


문자열 복사 계열 취약점에서 발생하는 부분에서는 바이트 코드로 사용할 수 없다는 문제점(범용성)과


이로인해 널바이트 코드 이후에 쉘 바이트 코드를 복사하지않아 정상적으로 작동하지 않는다는 문제점(신뢰성)을 지니고 있다.



결론적으로 공격자(해커)는 쉘바이트 코드에서 널바이트만을 제거하여 같은 동작을 하게끔 쉘코드를 작성하면 된다는 것이다.







실습


이전 포스팅에서 작성된 어셈블리 코드를 확인해보자





어셈블리 코드를 확인하여 보니


mov        byte   ptr [ebp-0Ch] ,   0


코드가 직접적으로 주소값[ebp-0Ch]에 0을 대입하기에, 이러한 이유로 널바이트 코드가 생기게 되는 것을 확인할 수 있다.


그렇다면 직접적으로 0을 대입하는 것이 아니라 ebp-0Ch의 값을 0으로 만들어주면 똑같은 동작을 하는 코드를 만들 수 있다고 판단하였다.






회색박스의 문제의 소지가 있는 어셈블리 코드를






빨간색 박스 내의 두줄의 어셈블리 코드를 추가하여 수정하였다.


추가된 두 어셈블리 코드의 기능은


xor명령어를 사용하여 ebx를 0으로 초기화 시켜준 후,


초기화된 ebx를 DWORD(4바이트) 크기만큼의 주소[ebp-0Fh]에 대입하여준다,








주소 [ebp-0Fh] DWORD 4바이트 크기만큼을 초기화 시켰을 경우의 메모리를 그림으로 그려보면 위와같다.



그후에 각 주소값에 바이트크기의 데이터를 대입하게 되면서


초기화된 [ebp-0fh]의 데이터를 제외한 나머지에는 데이터가 대입된다..


결과적으로 주소값[ebp-0Ch] 값 00이 들어가 있으며, 


첫번째로 작성된 어셈블리 코드(널바이트 문제의 소지가 있었던)가 모두 실행되었을 때의 동일한 구조의 메모리와 데이터가 형성된다.


그럼 실제로 수정된 어셈블리 코드가 정상 동작을 하는지 확인하여 보면





정상적으로 의도한 바대로 계산기 프로그램이 실행되는 것을 확인할 수 있었다.




수정된 어셈블리코드를


디버깅 모드[F5]를 통해 디스어셈블러 창을 열어 바이트 코드를 확인해보면




문제가 있던 널바이트는 사라진 형태의 바이트 코드를 확인할 수 있었다.


(사진에 오타가 있습니다. ebp-0Ch가 아닌 ebp-0Fh가 맞습니다. 이러한 이유로 바이트 코드또한 "89 5D F4" -> "89 5D F1"이 정상입니다.)






마지막으로 수정된 어셈블리 코드의 바이트코드를 추출하여,  실제 쉘 코드를 작성해본 결과





의도한 바대로 계산기 프로그램이 실행되는 것을 확인할 수 있다.





결론적으로


메모리상에서 같은 동작을 하는 어셈블리 코드는 정해진 문법에 따라서 만들면 무수히 많이 만들어 낼 수 있으며,

공격자는 같은 동작을 하게끔 하며 널바이트를 제거한다면 더욱 신뢰성이 높고 범용적인 쉘코드를 작성할 수 있다.