[모각코] #11 해킹맛보기 리버스 엔지니어링(3.7~)
3.7 패치
3.7.1 원하는 코드 위치 찾기
-
어셈블리어 코드를 한 줄씩 실행시켜 출력 상태 확인하기
-> Step Into[F7], Step Over[F8] 로 출력 상태 확인
-
문자열 검색
-> 마우스 오른쪽 버튼 클릭해 Search for > All referenced text strings 선택
( 찾고자 하는 코드 위에 실행하기!)
-
프로그램이 사용한 함수 검색
-> 마우스 오른쪽 버튼 클릭해 Search for > All intermodular calls 검색
3.7.2 메모리 패치
소스가 없는 프로그램을 자신이 원하는 결과로 수정하기
ex) Hello, Word!.exe 프로그램에서 출력하는 문자열을 메모리 패치를 통해 다른 문자열로 바꾸기
- 올리디버거로 Hello, Word!.exe 실행
- “Hello, Word!” 문자열 출력 코드로 이동
- 올리디버거 덤프 영역에서 마우스 오른쪽 버튼으로 Go to > Expression 메뉴 클릭 (Ctrl + G)
- 문자열 “Word” 드래그 후 마우스 오른쪽 버튼으로 Binary > Edit 메뉴
- 메모리 수정 창에서 아스키, 유니코드, 16진수 등의 부분에서 수정
3.7.3 코드 패치
-> printf 함수 호출전에 “Hello, word” 문자열 주소를 인자값으로 입력하는 코드를 수정해서 프로그램 패치
- 마우스 오른쪽 버튼 클릭으로 Binary > Edit 메뉴 선택/ 단축키 Ctrl + E 사용/ 어셈블리어 코드 더블 클릭
- 코드 패치 명령어 입력창을 통해 코드 패치
3.7.4 파일 저장
메모리가 패치되거나 코드 패치된 프로그램을 재실행하면 패치된 내용이 적용 X
=> 프로그램이 실행되고 있는 메모리에서만 패치가 이뤄져 디스크에 저장되어 있는 파일은 변화가 없기 때문!
-
패치된 내용을 파일에 적용시키기
-
패치된 문자열을 드래그 & 마우스 오른쪽 버튼 > Copy to executable file 메뉴 클릭
-
File 창에서 마우스 오른쪽 버튼 클릭 & save file 메뉴 선택 & 원하는 파일명으로 저장
-
3.8 실전
3.8.1 비밀번호
pass.exe 프로그램을 분석해 비밀번호 검사 루틴을 우회하거나 복구
-
프로그램 분석
-
디버깅
-> 브레이크 포인트로 특정 값을 살펴보거나 수정하기 위해 임의의 지점에서 프로그램 멈추기
-
브레이크 포인트
-
소프트웨어 브레이크 포인트
-
하드웨어 브레이크 포인트
-
-
-
점프 패치
-> 비밀번호 검사 우회
-
점프문 명령어
: EFLAGS 레지스터 상태에 따라 분기 결정
- 제로 플래그
- JE 명령어
- NOP 명령어
-
-
3.8.2 시리얼
-
시리얼 검사 루틴 찾기
->” The serial is incorrect” 검색
-
시리얼 검사 함수 찾기
-> 시리얼 검사 프로그램에 비밀번호 검사 함수 찾는 방법을 적용
-
브레이크 포인트 설정
-
함수 인자로 사용자가 입력한 시리얼 입력
-
**사용자가 입력한 시리얼값과 복화화된 시리얼값 비교 **
-
암호화된 시리얼을 복호화하여 올바른 시리얼 구함