调用printf()编辑可执行文件

时间:2011-01-10 17:57:14

标签: string newline printf format-string hardcode

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

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表示。

2 个答案:

答案 0 :(得分:2)

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

请参阅Code page 437表格中的字符编号。字符19和16(十进制)确实是一个右指向三角形和一个双重感叹号。

答案 1 :(得分:1)

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