Monday, August 5, 2013

Reversing - 파일의 빈영역에 Inline Patch 하기 (2)

 Reversing - 파일의 빈영역에 Inline Patch 하기 1부에 이어서...

40109b 부터 Decoding 이 이루어지며 checksum 값을 이용하여 변조 여부를 판별하기에
직접 변경하기에는 조금 까다롭습니다.

그래서 파일의 빈 영역을 확인하여 그 공간에 패치를 실행하는 코드를 삽입하고
EP코드에서 Decoding 이 모두 이루어진 다음에 우리가 만든 패치코드로 가는
jmp code 를 삽입한후 patch가 모두 끝나면 OEP로 이동하도록 만들겠습니다.

PEview 라는 유틸을 이용하여 빈공간을 확인해봅시다.













.text 섹션을 보면 size of raw data(file alignment) 는 0x400 이고 실제 사용하는
바이트(Virtual Size) 는 0x280 입니다. 즉 0x400 에서 0x280 을 뺀만큼은
빈 공간으로 Null Padding 영역입니다. 이 공간을 사용하도록 하겠습니다.
(참고로 File에서의 할당 단위는 Size of Raw Data, 또는 File Alignment 라고하고,
  메모리에서는 Section Alignment 라고합니다.)

그럼 빈 공간으로 이동해 봅시다.
Pointer to Raw Data 가 0x400 으로 시작지점은 0x400 입니다. 즉
0x400부터 0x680까지 사용하고 0x680부터 0x800 까지가 빈 영역입니다.

이러한 파일이 메모리 상으로 올라가게 되면 file alignment 가 아닌 section alignment
단위로 바뀌게 됩니다.

image base 값은 00400000 이며, section alignment 는 1000 입니다.
file alignment 에서는 400 + 280 이지만, 메모리에서는 1000 + 280 이라는 얘기입니다.
따라서 이동할 메모리 공간은 00401280 입니다.














이동을 해보면 역시 0 이 채워져 있는 Null Padding 영역임을 알 수 있습니다.
이제 위에서 구한 복호화 된 문자열을 다른 문자열로 patch 하겠습니다.











위 그림과 같이 패치하고 싶은 문자열을 넣고 해당 문자열이 있는 위치를
source로 하여 기존 문자열 [edi] 를 patch 합니다.
문자열은 \0 까지 포함하여 길이를 계산 합니다.














그리고 복호화가 완료되고 OEP로 가기전에 우리가 패치한 부분이
실행이 되게 401083 주소를 jmp 401280 으로 변경합니다.

그런후 저장을 하고 실행을 하게 되면 아래와 같이 checksum 오류가 발생합니다.
바로 401083 영역이 xor 7로 암호화 되어 있는 영역인데 이값을 변경해서 그렇습니다.
(401007~ 401085 까지가 xor 7 로 암호화된 영역입니다)












401083 의 화일에 해당하는 영역 0x483 으로 이동해 보겠습니다.
Hex edit 를 이용해 열어봅니다.












483 영역을보면 01f8e9 이라고 되어 있습니다.
xor 7 로 암호화 된 값이 이 값이 되어야 합니다.
따라서,

01 xor 7 = 6
f8 xor 7 = ff
e9 xor7 = ee
따라서 06ffee 값으로 변경 및 저장해 주셔야 합니다.















그리고 실행하면 정상적으로 patch가 되었음을 알수있다.

















- 참고 도서 : Reversing 핵심원리(이승원 저)

No comments:

Post a Comment