私のコードは次のとおりです。
#include <stdlib.h>
#include <unistd.h>
void myread () {
char s[10];
read(0, s, 100);
}
void getshell ()
{
system("/bin/bash");
}
int main ()
{
myread();
return 0;
}
コードをコンパイルし、ida pro を使用してバイナリ ファイルを開きました (gcc バージョンは 5.4.0、OS は ubuntu 16.04、コンパイル コマンドは「gcc -m32 -no-pie -fno-stack-protector stack_overflow.c - o stack_overflow ")、逆アセンブルされたコードは、バッファ s のアドレスが ebp - 12h であることを示していることがわかりました。どうして ebp - 10 ではないのでしょうか?
ssize_t myread()
{
char buf; // [esp+6h] [ebp-12h]
return read(0, &buf, 0x64u);
}
myread() の逆アセンブル コードは次のとおりです。
.text:0804843B
.text:0804843B ; Attributes: bp-based frame
.text:0804843B
.text:0804843B public myread
.text:0804843B myread proc near ; CODE XREF: main+11↓p
.text:0804843B
.text:0804843B buf = byte ptr -12h
.text:0804843B
.text:0804843B ; __unwind {
.text:0804843B push ebp
.text:0804843C mov ebp, esp
.text:0804843E sub esp, 18h
.text:08048441 sub esp, 4
.text:08048444 push 64h ; nbytes
.text:08048446 lea eax, [ebp+buf]
.text:08048449 push eax ; buf
.text:0804844A push 0 ; fd
.text:0804844C call _read
.text:08048451 add esp, 10h
.text:08048454 nop
.text:08048455 leave
.text:08048456 retn
.text:08048456 ; } // starts at 804843B
.text:08048456 myread endp
myread() のスタックは以下の通り、スタック保護機構とは関係ないようです
-00000018 ; D/A/* : change type (data/ascii/array)
-00000018 ; N : rename
-00000018 ; U : undefine
-00000018 ; Use data definition commands to create local variables and function arguments.
-00000018 ; Two special fields " r" and " s" represent return address and saved registers.
-00000018 ; Frame size: 18; Saved regs: 4; Purge: 0
-00000018 ;
-00000018
-00000018 db ? ; undefined
-00000017 db ? ; undefined
-00000016 db ? ; undefined
-00000015 db ? ; undefined
-00000014 db ? ; undefined
-00000013 db ? ; undefined
-00000012 buf db ?
-00000011 db ? ; undefined
-00000010 db ? ; undefined
-0000000F db ? ; undefined
-0000000E db ? ; undefined
-0000000D db ? ; undefined
-0000000C db ? ; undefined
-0000000B db ? ; undefined
-0000000A db ? ; undefined
-00000009 db ? ; undefined
-00000008 db ? ; undefined
-00000007 db ? ; undefined
-00000006 db ? ; undefined
-00000005 db ? ; undefined
-00000004 db ? ; undefined
-00000003 db ? ; undefined
-00000002 db ? ; undefined
-00000001 db ? ; undefined
+00000000 s db 4 dup(?)
+00000004 r db 4 dup(?)
+00000008
+00000008 ; end of stack variables