【问题标题】:call printf() editing the executable调用 printf() 编辑可执行文件
【发布时间】:2011-01-10 17:57:14
【问题描述】:

我试图“破解”一个控制台程序,迫使它显示一些东西。问题是我无法打印换行符 (\r\n)。 使用 disassebler 我找到了这个地方并编辑了二进制文件:

push 4ad0eb46                      ; the string (let's pretend "Hi guys")
push 4ad0eb80                      ; and the format ("%s")
call near ds:[<&msvcrt.printf>]    ; call printf
jmp 4ad0eb4f                       ; skip data

; now here I coded the strings

mov ds:[4ad289ec],eax              ; and here the program resumes

正如我所说,我无法打印换行符。我尝试在格式字符串中编码"\r\n"(所以它变成"%s\r\n",就像我在C中所做的那样)并打印"Hi guys\r\n",然后在 字符串本身(使其成为"Hi guys\x13\x10")并得到"Hi guys"和两个奇怪的字符,可能是0x13和0x10的ASCII表示。

【问题讨论】:

  • 你得到的“奇怪字符”到底是什么?你觉得奇怪的东西可能对其他人有用。
  • 一种“!!”和一个三角形,类似于'|>'

标签: string newline printf format-string hardcode


【解决方案1】:

您的第二次尝试将字符直接嵌入到字符串中,这是正确的方法。但是,您使用了错误的字符编号。 ASCII 中返回/换行的数字是 13 和 10(十进制),即 0x0d 和 0x0a(十六进制)。您使用了 0x13 和 0x10,它们是不同的字符。

有关字符编号,请参见Code page 437 的表格。字符 19 和 16(十进制)确实是一个直角三角形和一个双感叹号。

【讨论】:

    【解决方案2】:

    换行符(在 Windows 中)是 \r\n

    【讨论】:

      猜你喜欢
      • 2010-09-24
      • 2015-12-31
      • 2016-12-11
      • 1970-01-01
      • 2017-04-06
      • 2014-06-23
      • 2018-10-02
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多