Windows 汇编程序printf函数的奇怪行为
我在Windows 汇编程序printf函数的奇怪行为,windows,assembly,x86,printf,ida,Windows,Assembly,X86,Printf,Ida,我在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
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', 0xD, 0xA, 0
_main:
jmp detour
go_back:
retn
现在,我做了一个简单的绕道
——将代码
和数据
定义移动到代码
段的未使用端,如下所示:
str1 db 'Hello, World1',0Dh,0Ah,0
; DATA XREF: .text:detour↓o
str2 db 'Hello, World2',0Dh,0Ah,0
; DATA XREF: .text:00404057↓o
str3 db 'Hello, World3',0Dh,0Ah,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
这样的代码:
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', 0xD, 0xA, 0
_main:
jmp detour
go_back:
retn
这给我带来了一个问题。修补程序的输出为:
Hello, World1
Hello, World2
Hello, World3
ABh@@Hello, World2
Hello, World3
ABh@@Hello, World3
ABh@@
取而代之的是:
Hello, World 1
Hello, World 2
Hello, World 3
哪里有多余的3行和空行
ABh@@Hello, World2
Hello, World3
ABh@@Hello, World3
ABh@@
来自?Printf打印字符串,直到找到零符号为止 原始字符串以零结尾(结尾为0): 除str3外,新版本不包括:
str1 db 'Hello, World 1',0Dh,0Ah
str2 db 'Hello, World 2',0Dh,0Ah
str3 db 'Hello, World 3',0Dh,0Ah
db 0
因此,第一个printf调用将打印所有3个字符串,第二个是str2和str3,第三个是str3。我已经按照您的建议更新了代码,但是现在我得到了更奇怪的结果。查找我上面更新的问题。您能回答我更新的问题吗?IDA将正确的字符串显示为推送的注释(例如,“Hello,World 1\r\n”)。从静态上看,这似乎是正确的。您能在调试器中运行该程序并检查推送字符串的内容吗?我觉得这是由于重新定位和ASLR造成的。当映像加载到与基本映像不同的地址时,映像加载程序将使用重新定位数据更新代码。当你在一些Pe查看器中打开图像时,你能看到一个.reloc部分吗?为什么你说图像加载的地址与基本地址不同?我没有改变
main
功能位置,与原始位置相比。只有detour
标签上的代码被重新定位。。。