With 리버싱 핵심원리
GitHub - reversecore/book: 리버싱 핵심원리 - 소스 코드 및 실습 예제
리버싱 핵심원리 - 소스 코드 및 실습 예제. Contribute to reversecore/book development by creating an account on GitHub.
github.com
인라인 패치기법을 실습하는 파트입니다. 이 문제는 실행 코드가 암호화 되어있어 일련의 복호화 과정을 거친 후 해당 코드가 실행 됩니다.
실행시
이렇게 뜨게되는데, 실행화면1의 You must patch~ 부분과 실행화면2의 Status 옆에 화면1과 같은 문자열을 원하는 문자열로 패치해야 합니다. 프로그램을 OllyDBG로 디버깅을 해보면 반복문이 꽤 많은 것을 볼 수 있습니다.
위 사진과 비슷한 반복문이 여럿 존재하는데, 실행 코드들을 복호화 하는 반복문들 입니다.
문제는 4010F5~401249에 있는 데이터를 XOR 44하여 복호화
401007~401083을 XOR 7하여 복호화
문제는 4010F5~401249에 있는 데이터를 XOR 11하여 복호화
후 401007 코드를 실행하고, Checksum 하고
40124A~401280을 XOR 17하여 복호화 한 뒤
본래 코드의 OEP로 JMP하여 실행됩니다.
앞선 모든 반복문(복호화)을 거치면 그제서야 비로소 멀쩡한 코드가 40121E 주소에 보이기 시작합니다.
(만약 거친 후 이상하게 뜬다면, ctrl+A를 눌러 재분석해보세요)
이제 패치하기 위한 문자열들도 복호화 되어 정상적으로 뜰 것입니다.
출력하기까지 여러 과정을 거치지만, 40110A 와 401123을 패치하면 될 것 입니다.
당장 문자열을 마음대로 바꿀 순 없습니다. 과정을 보셨듯이 복호화 과정을 거친 후 Checksum으로 해당 부분이 변조되지 않았는지 확인까지 합니다. 그러면 복잡하게 하지 말고 인라인 패치를 통해 복호화 과정과 Checksum을 모두 우회하면 됩니다.
4010F5 복호화 => 401007 복호화 => 4010F5 복호화 => Checksum => 40124A 복호화 => JMP 40121E(OEP)
과정을 거치는데, 이 과정을 조금 바꾸면 됩니다.
4010F5 복호화 => 401007 복호화 => 4010F5 복호화 => Checksum => 40124A 복호화 => JMP 401290(Cave)
=> JMP 40121E(OEP)
Cave는 제가 만든 문자열을 패치하는 코드로 모든 과정을 거친 후 패치하기 때문에 아주 편리한 방법입니다.
우선 Cave랑 패치할 문자열은 복호화 되지 않는 구역에 입력해야 합니다.
사용하지 않는 부분에 제작된 Cave 코드입니다. 코드는 단순히 원하는 부분에 원하는 문자열을 패치한 후 원래 OEP로 JMP하는 코드입니다. 물론 원래 JMP 40121E 부분을 JMP 40128B로 바꿔야 정상적으로 패치됩니다.
이렇게만 하면 실행파일 자체에서는 패치되지 않기 때문에 실행파일을 HxD로 열어 JMP 40121E부분을 패치해줘야 합니다.
JMP 40121E의 opcode는 E99601 리틀 엔디안으로는 01 96 E9입니다. 해당 코드의 위치는 401083으로 파일에서의 오프셋을 계산하면
RAW = RVA - VA + PointerToRawData
= 401083 - 401000(Section VA) + 400 = 483
File에서 483위치의 값은 EE 91 06으로 되어 있으며 XOR 7 하면, E9 96 01로 원래 코드가 나옵니다.
그럼 우리가 원하는 코드로 바꾸기 위해선
E9 03 02 를 XOR 7하여 바꿔주면 됩니다. 바꾸면 EE 04 05 되고 값 그대로 패치해주면 끝.
'Reversing > 리버싱핵심원리' 카테고리의 다른 글
P2 - 13 PE File Format 정리 #2 (0) | 2022.09.12 |
---|---|
P2 - 13 PE File Format 정리 #1 (0) | 2022.09.11 |
P1-1,2 리버싱 기초 (0) | 2022.04.17 |