汇编程序 printf 函数奇怪的行为

问题描述

我在 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 - 将 codedata 定义移动到 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 这样的代码

_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。