ついさっきの質問の続き
前回は8bitレジスタにアドレスを格納しようとしましたが・・・
指摘されている通り、48bitあるアドレスを8bitレジスタに格納できるわけがありませんでした。
それで、私の知識の範囲内で考えたのですが
いい方法が思いつかないのでアドバイスお願いします。
s
1.globl main 2main: 3jmp run3 4 5run2: 6xor %eax,%eax 7mov $4,%AL 8xor %ebx,%ebx 9mov $1,%bl 10pop %rcx 11xor %edx,%edx 12mov $6,%dl 13int $0x80 14mov $1,%AL 15mov $0,%bl 16int $0x80 17 18run3: 19 call run2 20.asciz "hello"
シェルコードを作成しています。NULLバイトがあると非常に邪魔なので
NULLを除去するため、レジスタを8bit長にしました。(上記)
ただ、rcx(64bit長)を使用しているため
NULLバイトを除去できずにいます。
まず、このプログラムを64bitプロセスとして実行させているので
アドレスは48ビット長です。
なので・・・
8bit,16bit,32bitレジスタには格納しきれません。(てか、16bit以外に関してはそもそも使えなかった。)
なので、64bitモードだとrcxレジスタを使うしか選択肢がないのですが・・・
提案1
プロセスを32bitモードにする。そうすればアドレス帳は32bitになるはず。
ここで使えるレジスタは、rcx(32bit) と ecx(64bit) の2つ。
rcx
同じ方法でNULLバイトが検出されたので使えない。(わかっていたけど)
ecx
pop ecx
のような感じで使いたかったが、pop命令で32bitレジスタは使えない。
最終的にecxレジスタにアドレスが格納されればいいのだから
s
1pop %rbp 2 3movl %rbp,%ecx 4
中身は32bitなのだからできないことはないんじゃないか?
と思いましたが・・・
よくよく考えたら、このプロセス自体を64bitで実行させているので
64bitレジスタは使えませんよね?
ダメもとで、
cmd
1gcc -m32 sample.s
-m32オプションをつけてアセンブルを試みましたが、"rcxレジスタなんてない"
みたいな感じで、怒られます。
もう、NULLバイトさえつかなければどんな手段でも構わないので
rcxレジスタかecxレジスタにリターンアドレスを格納する方法はないでしょうか?
参考書では
32bitモード NASMコンパイラを使っていますが
pop命令も使えているし、
pop %ecx ・・・
pop命令って64bit限定ではないんでしょうか?
(64bitプロセスではないと使えないんでは?ということ)
64bitプロセスでも指定できなかったecxレジスタを使っている・・・
NASMコンパイラなら、使える・・・いや、違いますよね?
(参考書がおかしい・・・?)
なにかしらのヒントを貰えると嬉しいです。
分からないのでお願いします。
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2019/11/17 08:05
2019/11/17 08:17
2019/11/17 08:24 編集
2019/11/17 08:27
2019/11/17 08:44
2019/11/17 08:49
2019/11/17 10:30