본문 바로가기

해킹/System

#사진 날아감 [Windows_System] Shellcoding 쉘코딩법#2 (널바이트 제거법)

반응형

글 날아가서 다시 썻습니다~

https://r3dzone.tistory.com/16

==============================================================

이 포스팅은 "윈도우 시스템 해킹 가이드-버그헌팅과 익스플로잇"을 참조하며 만들었습니다.


지난번에 만든 쉘코드에는 널바이트가 들어있었습니다. 

널바이트는 보통 문자열의 마지막을 의미하기때문에 이 널바이트가 쉘코드에 포함되어있다면 그 쉘코드를 읽어오는 도중에 끊어질 수가 있습니다. 그렇게 되면 애써만든 쉘코드를 사용할 수 없게 됩니다.

그렇다면 이 널바이트를 제거하려면 어떻게 해야하나? 

여러 가지 방식이 존재할 수 있습니다. 어셈블리를 약간만 배웠다면 다양한 방식으로 이 널바이트를 없앨 수 있습니다.

다시한번 어셈으로 코딩한것을 디버깅해서 코드바이트를 봐줍니다.

문제가 되는 부분은 노란색으로 표시한 널바이트부분입니다. 저의 쉘코드에는 한부분이 문제가 되는 군요.

지난번 처럼 어셈을 한번 정리해봤습니다. 이때 널바이트를 만들어 내는 부분은 "mov byte ptr [ebp-0Ch],0"이네요

이 어셈은 ebp-0C영역에 0을 집어넣으라는 의미입니다.

0 즉 널(NULL)을 넣으니 당연히 널바이트가 생성될수밖에 없습니다.

그럼 이 0을 어떻게 넣어주면 될까요?

방법1. 0이 필요없는 다른 명령어로 대체

방법2. 32비트 레지스터가 아닌 16비트,8비트 레지스터 사용하기

방법3. 연산 명령을 사용해서 0을 결과로 나타냄 (포스팅 맨 위에 표기한 책을 참조하였습니다.)

이외에도 창의적으로 어셈블리를 조합해서 원하는 방식으로 널바이트를 없앨 수 있습니다.

위 나열한 방식중 방법2번은 저희가 없애야할 널바이트가 16비트나 8비트로 끊기지 않아 사용할 수 없으니 패스합니다.

그럼 방법1로 가봅시다.

xor 연산을 통해 ebx레지스터의 값을 0으로 만들어주고 그 ebx를 ebp-0C영역에 넣어줬습니다.

(xor연산은 두개의 값을 비교해서 다르면 1, 같으면 0을 목표레지스터에 저장합니다.)

결국 ebp-0C에는 똑같이 0이라는 값이 저장되게 되서 정상적으로 동작합니다.

디스어셈블리를 통해 다시 바이트 코드를 확인해봐도 널바이트가 없습니다! 성공!

이제 방법3을 사용해 볼까요?

mov 연산을 통해 ebp-0C에 1을 넣어주고 sub연산으로 1을 빼주었습니다. 

역시 ebp-0C에는 똑같이 0이라는 값이 저장되게 되서 정상적으로 동작합니다.

코드가 약간 길어졌긴 했지만 역시나 널바이트는 제거되었습니다!