问题描述
我在 IDA
(Pro 7.5) 中打开了一个简单的 Hello World 程序,如下所示:
global _main
extern _printf
section .text
_main:
push message
call _printf
add esp,4
push message2
call _printf
add esp,4
ret
message:
db 'Hello,World 1',0xD,0xA,0
message2:
db 'Hello,World 2',0
现在我做了一个简单的 detour
- 将 code
和 data
定义移动到 code
段的未使用端,如下所示:
str1 db 'Hello,World1',0Dh,0Ah,0
; DATA XREF: .text:detour↓o
str2 db 'Hello,World2',0
; DATA XREF: .text:00404057↓o
str3 db 'Hello,World3',0
; DATA XREF: .text:00404064↓o↓o
db 0
db 0
; ---------------------------------------------------------------------------
detour: ; CODE XREF: .text:_main↑j
push offset str1 ; "Hello,World 1\r\n"
call _printf
add esp,4
push offset str2 ; "Hello,World 2\r\n"
call _printf
add esp,4
push offset str3 ; "Hello,World 3\r\n"
call _printf
add esp,4
jmp go_back
_main:
jmp detour
go_back:
retn
这给我带来了麻烦。修补程序的输出是:
Hello,World1
Hello,World2
Hello,World3
ABh@@Hello,World3
ABh@@
而只是:
Hello,World 1
Hello,World 2
Hello,World 3
哪里有多余的 3 行和空行
ABh@@Hello,World3
ABh@@
从哪里来?
解决方法
Printf 打印字符串直到找到零符号。
您的原始字符串以零结尾(以 0 结尾):
db 'Hello,World 1',0xD,0xA,0
新的,除了 str3,不是:
str1 db 'Hello,0Dh,0Ah
str2 db 'Hello,World 2',0Ah
str3 db 'Hello,World 3',0Ah
db 0
因此第一个 printf 调用打印所有 3 个字符串,第二个 str2 和 str3,以及第三个 str3。