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 |