Self-Improvement

x64dbg 패치 및 저장 본문

리버싱 기초

x64dbg 패치 및 저장

JoGeun 2020. 5. 6. 14:34

CASE 구문에서 배운 소스코드의 Main 함수에서 입력값에 따라 [one], [two]...로 문자열을 출력하게 된다.

 

"[one]" 문자열 대신 다른 걸로 출력하게 문자열을 패치해본다.

"[one]" 문자열이 저장된 메모리의 7E7B6C 주소로 이동하여 [바이너리패치 - 패치]로 문자열을 변경해준다.

 

만약의 상황을 위해 패치할때 크기 유지를 체크한 뒤 해준다.

 

"[one]"을 "noONE"으로 패치한 후 확인해보면 정상적으로 변경되어 있다.

 

만약 기존의 글자보다 길에 써야할 경우에는 이 프로그램이 침범하지 않을 사용하지 않을 공간에 작성한 뒤 명령어를 패치해준다.

 

위 007E9444 주소를 기존 "[two]" 문자열 주소를 불러오는 어셈블 명령어를 007E9444주소로 변경한다.

Space를 누르거나 [오른쪽 마우스 -어셈블]하여 수정하며 이때도 크기 유지는 해주는게 좋다.

 

그리고 변경한 데이터들은 재시작하면 날라가기 때문에 파일로 저장을 해준다.

[CTRL+P] 또는 [오른쪽 마우스 - 패치] 후 파일 패치를 눌러주면 된다.

 


소스코드

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
#include <stdio.h>
#include <string.h>
 
int hidden_value = 0xdeadf00d;
int main(void) {
    char buf[100];
    printf("input password: ");
    gets_s(buf);
 
    if (strncmp(buf, "reversing"9!= 0) {
        printf("invalid password");
        return -1;
    }
    printf("hidden value: 0x%x\n", hidden_value);
}
cs

 

사용자가 입력한 패스워드 값이 맞으면 숨겨진 value을 출력하는 예제이다.

이때 패스워드가 "reversing"이어야 정상적으로 도달할 수 있다. 이것을 패치로 우회해본다.

 

우회할 수 있는 방법은 레지스터, 플래그, 어셈블 패치 등 여러가지 있다.

이 중에서 strncmp 비교문에서 무조건 참으로 JMP하게 만들도록 어셈블을 고쳐본다.

기존에는 "test eax,eax"를 통해 0인지 비교하고 참이면 32192E 주소로 이동하게되며 거짓일시 바로 다음행을 수행하며 "invaild password"가 출력되며 종료하게 된다.

 

je를 JMP로 고치면 무조건 32192E로 이동하게되어 참이 된다.

 

아무값이나 입력해도 숨겨진 value가 출력이 이루어진다.

 

패치한것을 저장하고 싶으면 [ctrl+p]로 저장하면 된다.