ここに C 関数を記述しました (バッファ オーバーフローの脆弱性があります)。
void func(char *str)
{
char buffer[12];
int a=9;
strcpy(buffer,str);
}
gdb でのアセンブリは次のように変換されます
|0x4005b4 <func> push %rbp
|0x4005b5 <func+1> mov %rsp,%rbp
|0x4005b8 <func+4> sub $0x40,%rsp
|0x4005bc <func+8> mov %rdi,-0x38(%rbp)
|0x4005c0 <func+12> mov %fs:0x28,%rax
|0x4005c9 <func+21> mov %rax,-0x8(%rbp)
|0x4005cd <func+25> xor %eax,%eax
|0x4005cf <func+27> movl $0x9,-0x24(%rbp)
|0x4005d6 <func+34> mov -0x38(%rbp),%rdx
|0x4005da <func+38> lea -0x20(%rbp),%rax
|0x4005de <func+42> mov %rdx,%rsi
|0x4005e1 <func+45> mov %rax,%rdi
|0x4005e4 <func+48> callq 0x400490 <strcpy@plt>
|0x4005e9 <func+53> mov -0x8(%rbp),%rax
|0x4005ed <func+57> xor %fs:0x28,%rax
|0x4005f6 <func+66> je 0x4005fd <func+73>
|0x4005f8 <func+68> callq 0x4004a0 <__stack_chk_fail@plt>
|0x4005fd <func+73> leaveq
|0x4005fe <func+74> retq
rdi
関数に渡された元の文字配列のアドレスが含まれます。
1.func+8
では、この rdi 値を -0x38(rbp) に移動して、関数のローカル変数 str に値を保存していますか、それとも他の意味がありますか?
2. での指導は何をfunc+8
達成しますか? の内容を表示するためにgdbまたはLinuxにとにかくありfs segment
ますか?
3.指示は何func+12
をfunc+25
しますか?
編集:これをgcc 4.6.3で-O0でコンパイルしました