본문 바로가기

공부/리버싱 핵심원리

인라인 패치 실습

1. unpackme#1.aC 실행

abex' chacma #2: visual basic으로 작성된 프로그램

시리얼 키(serial key)를 검증하는 프로그램

현재 상태


2. 디버깅 시작

1. 00401001에서 함수 CALL

2. 이후 RETN > OEP로 이동 예상됨

 

401007 주소 이후는 암호화된 코드.

문자열도 암호화되어 있어 찾기 불가능.

 

[F7]로 디버깅 계속하다보면 복호화 루프 1이 나옴

루프 1과 루프 2의 복호화 영역이 같음 = 그 영역은 이중으로 인코딩됨

 

OEP에 BP를 걸고 실행시키면 복호화가 완료된다.

그런데 문자열이 문자 하나하나로 보인다.

복호화 한 영역을 Ollydbg가 영역의 값을 1byte씩만 읽어낸 탓에 코드가 아닌 데이터로 인식하여 일어난 오류다.

[Ctrl + a]를 누르면 정상적으로 보인다.

 

메시지 박스 위치

 

인자로 받는 4010F5 주소로 가면 패치해야 할 문자열이 보인다.


3. 인라인 패치 실습

OEP로 점프하기 전, 패치 코드를 거치고 점프해야 한다.

 

패치 코드의 삽입 위치

1) 파일의 빈 영역 > 패치 코드의 크기가 작은 경우

2) 마지막 섹션을 확장 후 설치

3) 새로운 섹션을 추가한 후 설치

 

파일의 빈 영역을 찾는다.

PEView로 예제 파일의 첫 번째 섹션(.text) 헤더를 살펴보면 파일의 크기는 400h이지만 실제 메모리에 로딩되는 것은 280h뿐이다. 그럼 나머지 281~400h가 로딩되지 않는 영역, 즉 Null padding 영역이다.

 

첫 번째 섹션의 빈 영역에 해당하는 부분

 

코드 수정 (401280~)

저장 후 종료 ['Copy to executable - All modifications' 명령 -> Save File]

 

JMP OEP를 JMP Patch Code로 수정

전 > 후

 

실행... 하면

오류가 뜬다

사유: 복호화 완료된 코드를 저장시켜버려서 복호화 완료된걸 또 복호화 시켜버렸기 때문...

원본 코드에 다시 패치 코드를 넣고 실행시켜보았다

 

그래도 기동이 안 된다

사유: 추가 패치  영역은 현재 복호화 된 상태이지만 원래 코드는 XOR 7로 암호화가 되어있

>> Ollydbg를 이용하여 패치할 것이 아니라 암호화된 기준으로 HxD를 이용하여 수정해야 함

 

암호화된 영역은 483~485, 뒤의 00 00은 암호화 영역 x
실제로 HxD의 값(EE 91 06)이 복호화 과정을 통해 위 Ollydbg에서의 값(E9 96 01)으로 바뀐다

 

변경할 JMP 주소는 401280. 명령문의 Instruction으로 바꿔보면 E9 F8010000. 앞의 3byte를 각각 나눠 XOR 7을 하면

 

E9 XOR 7 = EE
F8 XOR 7 = FF
01 XOR 7 = 06

 

으로 변환된다. 이를 HxD에 입력한 후 저장한다

 

패치 완료

'공부 > 리버싱 핵심원리' 카테고리의 다른 글

DLL 인젝션  (0) 2024.05.21
Windows 메시지 후킹  (0) 2024.05.21
UPX 언패킹  (0) 2024.05.12
IAT 따라가기  (0) 2024.05.12
PE File Format  (0) 2024.05.11