修改函数以返回静态值

逆向工程 艾达
2021-06-16 23:21:06

我正在测试二进制文件上学习 IDA pro,我想从此函数返回一个静态值:

; __int64 __fastcall sub_B580(char *name)
sub_B580 proc near

pai= qword ptr -70h
req= addrinfo ptr -68h
service= byte ptr -2Fh
var_20= qword ptr -20h

; __unwind {
push    rbp
push    rbx
sub     rsp, 68h
mov     rax, fs:28h
mov     [rsp+78h+var_20], rax
xor     eax, eax
test    rdi, rdi
jz      loc_B676

1个回答

从任何函数返回静态值非常容易。我假设您的调用约定在 (e|r)ax 寄存器中采用返回值。

所以要返回一些值,只需修补你的函数看起来像

mov rax, <value>
ret

让我们考虑一个例子。

#include <stdio.h>

int test(int n) {
    int i, sm = 0;
    for (i = 1; i <= n; i++)
        sm += (i * i);
    return sm;
}

int main(int argc, char **argv) {
    int n;
    scanf("%d", &n);
    printf("%d\n", test(n));
    return 0;
}

运行时,这看起来像

$ ./test
9
285
$ ./test
10
385

编译后,这看起来像

.text:0000000000000720                 public test
.text:0000000000000720 test            proc near               ; CODE XREF: main+2C↓p
.text:0000000000000720
.text:0000000000000720 var_14          = dword ptr -14h
.text:0000000000000720 var_8           = dword ptr -8
.text:0000000000000720 var_4           = dword ptr -4
.text:0000000000000720
.text:0000000000000720 ; __unwind {
.text:0000000000000720                 push    rbp
.text:0000000000000721                 mov     rbp, rsp
.text:0000000000000724                 mov     [rbp+var_14], edi
.text:0000000000000727                 mov     [rbp+var_8], 0
.text:000000000000072E                 mov     [rbp+var_4], 1
.text:0000000000000735                 jmp     short loc_745
.text:0000000000000737 ; ---------------------------------------------------------------------------
.text:0000000000000737
.text:0000000000000737 loc_737:                                ; CODE XREF: test+2B↓j
.text:0000000000000737                 mov     eax, [rbp+var_4]
.text:000000000000073A                 imul    eax, [rbp+var_4]
.text:000000000000073E                 add     [rbp+var_8], eax
.text:0000000000000741                 add     [rbp+var_4], 1
.text:0000000000000745
.text:0000000000000745 loc_745:                                ; CODE XREF: test+15↑j
.text:0000000000000745                 mov     eax, [rbp+var_4]
.text:0000000000000748                 cmp     eax, [rbp+var_14]
.text:000000000000074B                 jle     short loc_737
.text:000000000000074D                 mov     eax, [rbp+var_8]
.text:0000000000000750                 pop     rbp
.text:0000000000000751                 retn
.text:0000000000000751 ; } // starts at 720
.text:0000000000000751 test            endp

单击从 0x720 开始的函数。转到编辑 -> 补丁程序 -> 组装。

在打开的窗口写

mov eax, 99

并按确定。

它将修补当前的push rbp.

最后写

ret

按 OK 然后按 Cancel 停止修补。

转到编辑 -> 补丁程序 -> 将补丁应用到输入文件

使用更新的更改保存二进制文件。现在它运行就像

$ ./test
9
99
$ ./test
10
99
$ ./test
99
99