質問編集履歴

3 追記

kazuyakazuya

kazuyakazuya score 161

2019/11/17 15:51  投稿

rcx・ecxレジスタにNULLバイトがないようにリターンアドレスを入れたい。
[ついさっきの質問の続き](https://teratail.com/questions/223688)
前回は8bitレジスタにアドレスを格納しようとしましたが・・・
指摘されている通り、48bitあるアドレスを8bitレジスタに格納できるわけがありませんでした。
それで、私の知識の範囲内で考えたのですが
いい方法が思いつかないのでアドバイスお願いします。
```s
.globl main
main:
jmp run3
 
run2:
xor %eax,%eax
mov $4,%AL
xor %ebx,%ebx
mov $1,%bl
pop %rcx
xor %edx,%edx
mov $6,%dl
int $0x80
mov $1,%AL
mov $0,%bl
int $0x80
run3:
call run2
.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
pop %rbp
movl %rbp,%ecx
```
中身は32bitなのだからできないことはないんじゃないか?
と思いましたが・・・
よくよく考えたら、このプロセス自体を64bitで実行させているので
よくよく考えたら、このプロセス自体を64bitで実行させているので
64bitレジスタは使えませんよね?
ダメもとで、
```cmd
gcc -m32 sample.s
```
-m32オプションをつけてアセンブルを試みましたが、"rcxレジスタなんてない"
みたいな感じで、怒られます。
もう、NULLバイトさえつかなければどんな手段でも構わないので
rcxレジスタかecxレジスタにリターンアドレスを格納する方法はないでしょうか?
参考書では
32bitモード NASMコンパイラを使っていますが
pop命令も使えているし、
pop %ecx ・・・
pop命令って64bit限定ではないんでしょうか?
(64bitプロセスではないと使えないんでは?ということ)
64bitプロセスでも指定できなかったecxレジスタを使っている・・・
NASMコンパイラなら、使える・・・いや、違いますよね?
(参考書がおかしい・・・?)
なにかしらのヒントを貰えると嬉しいです。
分からないのでお願いします。
  • アセンブリ言語

    251 questions

    アセンブリ言語とは、機械語を人間にわかりやすい形で記述した低水準言語です。

2 追記

kazuyakazuya

kazuyakazuya score 161

2019/11/17 15:50  投稿

rcx・ecxレジスタにNULLバイトがないようにリターンアドレスを入れたい。
[ついさっきの質問の続き](https://teratail.com/questions/223688)
前回は8bitレジスタにアドレスを格納しようとしましたが・・・  
 
指摘されている通り、48bitあるアドレスを8bitレジスタに格納できるわけがありませんでした。  
 
それで、私の知識の範囲内で考えたのですが  
 
いい方法が思いつかないのでアドバイスお願いします。
```s
.globl main
main:
jmp run3
 
run2:
xor %eax,%eax
mov $4,%AL
xor %ebx,%ebx
mov $1,%bl
pop %rcx
xor %edx,%edx
mov $6,%dl
int $0x80
mov $1,%AL
mov $0,%bl
int $0x80
run3:
call run2
.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
pop %rbp
movl %rbp,%ecx
```
中身は32bitなのだからできないことはないんじゃないか?
と思いましたが・・・
よくよく考えたら、このプロセス自体を64bit長で実行させているので
64bitレジスタは使えませんよね?
ダメもとで、
```cmd
gcc -m32 sample.s
```
-m32オプションをつけてアセンブルを試みましたが、"rcxレジスタなんてない"
みたいな感じで、怒られます。
もう、NULLバイトさえつかなければどんな手段でも構わないので
rcxレジスタかecxレジスタにリターンアドレスを格納する方法はないでしょうか?
参考書では
32bitモード NASMコンパイラを使っていますが
pop命令も使えているし、
pop %ecx ・・・
pop命令って64bit限定ではないんでしょうか?
(64bitプロセスではないと使えないんでは?ということ)
64bitプロセスでも指定できなかったecxレジスタを使っている・・・
NASMコンパイラなら、使える・・・いや、違いますよね?
(参考書がおかしい・・・?)
なにかしらのヒントを貰えると嬉しいです。
分からないのでお願いします。
  • アセンブリ言語

    251 questions

    アセンブリ言語とは、機械語を人間にわかりやすい形で記述した低水準言語です。

1 追記

kazuyakazuya

kazuyakazuya score 161

2019/11/17 15:48  投稿

rcx・ecxレジスタにNULLバイトがないようにリターンアドレスを入れたい。
[ついさっきの質問の続き](https://teratail.com/questions/223688)
いい方法が思いつかないのでアドバイスお願いします。
```s
.globl main
main:
jmp run3
 
run2:
xor %eax,%eax
mov $4,%AL
xor %ebx,%ebx
mov $1,%bl
pop %rcx
xor %edx,%edx
mov $6,%dl
int $0x80
mov $1,%AL
mov $0,%bl
int $0x80
run3:
call run2
.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
pop %rbp
movl %rbp,%ecx
```
中身は32bitなのだからできないことはないんじゃないか?
と思いましたが・・・
よくよく考えたら、このプロセス自体を64bit長で実行させているので
64bitレジスタは使えませんよね?
ダメもとで、
```cmd
gcc -m32 sample.s
```
-m32オプションをつけてアセンブルを試みましたが、"rcxレジスタなんてない"
みたいな感じで、怒られます。
もう、NULLバイトさえつかなければどんな手段でも構わないので
rcxレジスタかecxレジスタにリターンアドレスを格納する方法はないでしょうか?
参考書では
32bitモード NASMコンパイラを使っていますが
pop命令も使えているし、
pop %ecx ・・・
pop命令って64bit限定ではないんでしょうか?
(64bitプロセスではないと使えないんでは?ということ)
64bitプロセスでも指定できなかったecxレジスタを使っている・・・
NASMコンパイラなら、使える・・・いや、違いますよね?
(参考書がおかしい・・・?)  
なにかしらのヒントを貰えると嬉しいです。
分からないのでお願いします。
  • アセンブリ言語

    251 questions

    アセンブリ言語とは、機械語を人間にわかりやすい形で記述した低水準言語です。

思考するエンジニアのためのQ&Aサイト「teratail」について詳しく知る