Ubuntu 12.04.1 LTSで実行ファイルをgccを用いて作成し、逆アセンブルしたところ、気になる箇所があったので質問させていただきます。(申し訳ないのですが、アセンブラのタグが見つけられなかったので、C、GCC、GDBというタグをつけさせていただきました。)
環境は以下のとおりです。
$ uname -a Linux tukejonny-virtual-machine 3.2.0-97-generic-pae #137-Ubuntu SMP Thu Dec 17 21:37:53 UTC 2015 i686 i686 i386 GNU/Linux $ lsb_release -a No LSB modules are available. Distributor ID: Ubuntu Description: Ubuntu 12.04.1 LTS Release: 12.04 Codename: precise $ gcc --version gcc (Ubuntu/Linaro 4.6.3-1ubuntu5) 4.6.3 Copyright (C) 2011 Free Software Foundation, Inc. This is free software; see the source for copying conditions. There is NO warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
この環境で以下のようにC言語のソースコードを作成し、そのファイルをgccでコンパイルしました。
hige@piyo:~$ cat hello.c #include <stdio.h> int main(void) { printf("Hello, World!\n"); return 0; } hige@piyo:~$ sudo sysctl -w kernel.randomize_va_space=0 kernel.randomize_va_space = 0 hige@piyo:~$ gcc -fno-stack-protector -z execstack -o hello hello.c hige@piyo:~$ ls -l hello-rwxrwxr-x 1 hoge hoge 7159 1月 29 14:16 hello
gdbでmain関数の部分を逆アセンブルすると、
hige@piyo:~$ gdb -q ./hello (no debugging symbols found)...done. gdb$ disas main Dump of assembler code for function main: 0x080483d4 <+0>: push ebp 0x080483d5 <+1>: mov ebp,esp 0x080483d7 <+3>: and esp,0xfffffff0 <- ? 0x080483da <+6>: sub esp,0x10 ... End of assembler dump.
push ebp; mov ebp, esp; sub esp, 0x10;
という命令列は、関数エピローグとして紹介されたことがあったので知っていたのですが(old ebpをスタックにpushし、espの値をebpに移送、espから10進数だと16を引くことでその関数のローカル変数領域を確保する)、and esp, 0xfffffff0という命令がありますが、これは何を意味しているのでしょうか?
ぱっと見では、espと0xfffffff0の値の論理積を取り、その値をespに格納しているようですが、関数プロローグの一部として、この命令がどういった意味を持っているのかがわかりません。
初歩的な質問でお恥ずかしい限りですが、どなたかご教授いただけないでしょうか?

回答3件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2016/02/07 16:03