OllyDbg 코드 패치 - Yerim-Lee/Reversing GitHub Wiki
목차
- 패치란
- 패치 후 모습
- hello world 텍스트 부분 찾기
- UNICODE 수정
- 패치 후 저장하기
- null 부분에서 실행하기
분석환경
VMWare - Windows XP Professional
Tool - Ollydbg
파일 - helloworld.exe
패치란
패치란 일반적으로 이미 발표된 소프트웨어제품에서 발견된 사소한 기능 개선 또는 버그나 오류 등을 수정하기 위해 개발자(개발 회사)가 내놓는 업데이트 프로그램을 지칭한다. 이번에는 코드 패치를 해보려고 한다.
패치 후 모습
이 화면은 코드 패치 후 저장까지하여 실행시킨 모습이다. 기존의 Hello World! 문자열이 아닌 abcdefghijkl 라는 문자열로 변경시키는 작업을 하였다.
Hello World! 찾기
문자열을 변경시키기 위해서 먼저 메인 함수에서 Hello World! 라는 문자열이 있는 부분을 찾는다. 주석 부분을 보면 UNICODE "Hello World!" 라고 적혀있는 걸 볼 수 있다. 그리고 어셈블리어 부분을 보면 004092A0 이라는 Address가 적혀있다.
UNICODE 수정
아래 Hex Dump 부분에서 Go to 명령어로 방금 찾은 004092A0을 검색한다. Hex dump 오른쪽에 ASCII 코드는 한 번 클릭하면 UNICODE 로 전환된다. 화면처럼 Hello World! 문자열이 있는 부분을 드래그한 후 Ctrl + e 단축키를 통해서 수정할 수 있다. UNICODE에 현재 Hello World! 라고 적혀있는 문자열을 지우고 내가 사용하고 싶은 문자열로 변경해준다. 한글은 사용하지 못하고 영어만 가능하다. 나는 abcdefghijkl 로 바꾸어주었다. 그러면 화면처럼 아래 Hex dummp 부분의 UNICODE도 변경이 되고, Disassembly부분의 주석에 있는 UNICODE도 변경이 된 걸 확인할 수 있다. f9 단축키로 실행을 시키면 수정한 문자열 abcdefghijkl 을 확인할 수 있다. 하지만 다시 실행시키면 수정 전 원래의 값인 Hello World! 가 출력되는 것을 볼 수 있다. 이 이유는 변조를 시켜도 저장을 하지 않았기 때문이다.
패치 후 저장하기
패치 후 저장을 하지 않으면 원래의 값이 다시 출력된다는 것을 확인했다. 패치 후 저장하는 방법은 앞서 정리한 방법대로 UNICODE 수정 후 Hex dump 부분에서 오른쪽 마우스 클릭 후 Copy to executable file 을 눌러준다. 그러면 Hex dump 창이 추가로 뜨는데 이 창을 닫으려고 하면 File changed 창이 하나 뜬다. 그럼 Yes를 눌러주고 본인이 찾기 쉬운 이름으로 저장하면 끝이다. 저장한 파일을 열어 f9로 실행시켜주면 문자열 패치가 잘 된 것을 확인할 수 있다.
null 부분에서 실행하기
지금까지는 원래 메인 함수 부분에서 UNICODE를 수정해주었는데 아무것도 없는 null 부분에서도 내가 원하는 문자열을 실행시킬 수 있다. 나는 Hex dump 에서 수정했던 Address인 004092A0 위치에서 내리다보면 UNICODE 부분에 . . . . . 이런 식으로 null 값이 있다. 이 부분을 드래그해서 똑같이 Ctrl + e 단축키를 사용하여 내가 사용하고 싶은 문자열을 입력해준다. 여기서 아래 keep size 선택은 풀어준다.(내가 드래그한만큼 영역을 확장시켜줌) 나는 hhhhhhhhhhh 이라고 문자열을 입력해줬다. 그리고 현재 입력한 Address는 00409BB0 이기 때문에 어셈블리어 부분에서 기존에 가리켰던 주소가 아닌 현재 입력한 Address 를 가리킬 수 있도록 수정해줘야한다. 주석에 UNICODE라고 적혀있던 텍스트 부분에서 스페이스 바를 눌러 PUSH 뒤 주솟값을 00409BB0으로 수정하고 한 번만 확인을 한 후 Cancel을 눌러 창을 닫아준다. Cancel을 누르지 않으면 다른 줄까지 수정이 되버릴 수 있다. 주솟값까지 수정하고 실행시키면 null값에 작성했던 hhhhhhhhhhh가 나오는 걸 확인할 수 있다. 이것도 마찬가지로 저장하지 않으면 다시 실행 시 기존의 코드(문자열)대로 실행된다.