이 기법은 Dos시절에 자주 애용되었던기법으로 기억한다....
(필자는 27살로 Dos 4.0이전버젼부터 사용해보았다..)

실행파일은 크게 데이터섹션과 코드섹션 정도로 나뉜다고 볼수있다.
좀더 간결하게 본다면 바이너리 헤더가 붙고 그뒤에 코드와관련된 데이터가 주루룩 나온다.

어떤 실행파일을 실행하면 부가적으로 필요한 데이터를 기록해서 불러오게 하고싶다.
예를 들자면 dll injection을 수행하고 싶은데 exe와 dll을 같이 배포할 순 없다.....(대부분 불법적인 목적이므로)

그럼 어떻게 배포 해야 가능할까?
exe안에 injection에 사용할 dll을 기록하면 되지않을까? 빙고.......바로 이것이다.
그럼 어떻게 하면될까?
위에서 잠시 언급했던대로 실행파일의 끝에 dll을 붙이고, 그 실행파일이 자기자신의 뒤에 붙어있는 dll을 특정위치에 해제시키고, 그 dll을 통해 인젝션을 수행하면 가능할 것이다.

이러한 작업을 하려면 어떠한 프로세스가 필요할까?
plain.exe  
insert.exe
output.exe

대략 이런 3개의 파일의 구조를 가질것이다.

하나하나 설명해보자
plain.exe이것은 데이터를 붙이기전의 해제하여 인젝션을 수행하는 코드가 들어있는 바이너리이다.
insert.exe이것은 plain.exe에 해제하고싶은 데이터를 붙이는 역할을 수행한다.
output.exe는 plain.exe에 dll데이터가 합쳐진 결과물이다.
간단한 수식으로 도식한다면
plain.exe + 머시기.dll = output.exe가 된다고 표현할 수 있다.
+연산 작업은 insert.exe를 통해서 한다고 생각하면 되겠다.

그럼 이러한 작업은 어찌 수행될까?
plain.exe는 원래의 데이터가 붙여지기전 자신의 바이너리의 길이를 알고있어야한다.
그 코드는 자기자신 즉 실행파일을 오픈하여 원래 길이만큼을 점프뛴후,
이후의 내용을 끝까지 읽어 특정 위치에 dll을 기록한다.
이후 그 특정위치에 기록된 dll을 이용하여 인젝션을 수행하면 된다.
내용은 간단하지 그렇지않은가?
실제 구현되는 순서는 아래와같다.
dll이 특정위치에 있다고 가정하고 코드를 작성한다.
또한 그 코드를 불러오는 코드까지 작성한다(자신의 길이를 가상으로 변수를 선언해서 저장한다.)
이 코드를 컴파일한후 파일의 사이즈를 얻는다
그리고 소스안에 위치한 변수(바이너리 길이를 저장한 변수)에 방금 읽은 값을 기록하여 다시 컴파일한다
이후 insert를 통해서 데이터를 방금생성한 바이너리끝에 붙여준이후 실행을 시키면
작동이 된다.

간단하지 않은가?

인젝션을 제외하고, 특정데이터를 붙이고 그걸 다시 기록하는 코드를 샘플로 작성해 두었으나, 소스가 너무 난잡하여 잠시 보류하겠다.....( 사실 이 소스는 후배가 가르쳐달라하여 보여주기위한 목적으로 작성된 소스라 예외처리따윈 전혀 되어있지도않다..)

수행소스코드는 차후에 기회가 된다면 이 글을 수정하여, 파일을 첨부하겠다.
궁금한 블로거가 있다면
글을 남겨주길바란다. 글을 남기는 순간까지 파일이 업로드되어있지않다면 필자가 가진 샘플 소스를 보내주겠다.

posted by Sense.J
: