[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