콘텐츠로 이동

[Frida] 함수 Hooking해서 Return 값 바꾸는 방법

서론

Interceptor로 함수 후킹하여 해당 함수의 Return 값을 변조하는 방법에 대해 알아보자.

방법 1. onLeave Argument 수정

함수 호출 완료 후 onLeave의 Argument로 Return 값을 변조할 수 있다.
0x1(True)의 Return 값을 0x0(False)으로 변조 후 출력하는 코드다.

Interceptor.attach([대상 함수 NativePointer], {
    onLeave: function (ret) {
        console.log('[-] onLeave');
        console.log('Return : ' + ret);
        ret.replace(0x0);
        console.log('Replaced : ' + ret);
    }
})

주의

ret = 0x0; 으로 수정하면 변경한 Return 값이 적용되지 않는다.

[실행결과]
[-] onLeave
Return : 0x1
Replaced : 0x0
>_

방법 2. Register(EAX) 수정

함수 호출이 완료 된 후 Return 값은 EAX 레지스터에 들어간다.
EAX를 직접 바꾸어 Return 값을 변조 할 수 있다.
context를 사용하여 레지스터에 접근할 수 있다.
다음은 EAX를 0x0으로 수정하는 코드다.

Interceptor.attach([대상 함수 NativePointer], {
    onLeave: function (ret) {
        console.log('[-] onLeave');
        var reg = this.context;
        console.log(JSON.stringify(reg, 0, 2));
        reg.eax = 0x0;
        console.log(JSON.stringify(reg, 0, 2));
    }
})
[실행결과]
[-] onLeave
{
"pc": "0x760d10d0",
"sp": "0x4ff8e4",
"eax": "0x1",
"ecx": "0x55d46be6",
"edx": "0x9c0000",
"ebx": "0x0",
"esp": "0x4ff8e4",
"ebp": "0x4ff978",
"esi": "0x9c5007",
"edi": "0x93370",
"eip": "0x760d10d0"
}
{
"pc": "0x760d10d0",
"sp": "0x4ff8e4",
"eax": "0x0",
"ecx": "0x55d46be6",
"edx": "0x9c0000",
"ebx": "0x0",
"esp": "0x4ff8e4",
"ebp": "0x4ff978",
"esi": "0x9c5007",
"edi": "0x93370",
"eip": "0x760d10d0"
}
>_

결론

Return 값 변조하는 방법

  • 방법 1. onLeave Argument를 replace로 수정
  • 방법 2. this.context의 eax 값을 수정

끝.


마지막 업데이트: 2022-05-13

댓글