함수 Hooking해서 Return 값 바꾸는 방법
Interceptor로 함수 후킹하여 해당 함수의 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 값을 수정
끝.