然而这个问题很古老:
In your main.c
,您在末尾有一个换行符,并且没有使用任何格式化功能printf
.
如果我看一下输出LD_DEBUG=all LD_PRELOAD=./printhack.so hello 2>&1
(我稍微重命名了你的文件),然后在底部附近我可以看到
17246: transferring control: ./hello
17246:
17246: symbol=puts; lookup in file=./hello [0]
17246: symbol=puts; lookup in file=./printhack.so [0]
17246: symbol=puts; lookup in file=/lib/x86_64-linux-gnu/libc.so.6 [0]
17246: binding file ./hello [0] to /lib/x86_64-linux-gnu/libc.so.6 [0]: normal symbol `puts' [GLIBC_2.2.5]
并且没有实际提及printf
. puts
基本上是 printf 没有格式并且在末尾有自动换行符,所以这显然是 gcc 通过替换“有帮助”的结果printf
with a puts
.
为了使您的示例正常工作,我删除了\n
来自printf
,这给了我这样的输出:
17114: transferring control: ./hello
17114:
17114: symbol=printf; lookup in file=./hello [0]
17114: symbol=printf; lookup in file=./printhack.so [0]
17114: binding file ./hello [0] to ./printhack.so [0]: normal symbol `printf' [GLIBC_2.2.5]
现在我可以看到printhack.so
确实是被它的习俗所拖累printf
.
或者,您可以定义自定义puts
函数还有:
static int (*orig_puts)(const char *str) = NULL;
int puts(const char *str)
{
if (orig_puts == NULL)
{
orig_puts = (int (*)(const char *str))dlsym(RTLD_NEXT, "puts");
}
// TODO: print desired message from caller.
return orig_puts("within my own puts");
}