Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/assembly/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Windows 汇编程序printf函数的奇怪行为_Windows_Assembly_X86_Printf_Ida - Fatal编程技术网

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
标签上的代码被重新定位。。。