私は最近、危険なプログラムを悪用し、x86-64アーキテクチャのgcc
のバージョンの違いについて興味深いものを見つけました。この改善の原因と利点は、gccバージョン> 4.9.0とgccバージョン<4.9?
注:
gets
の不法使用方法はこちら問題ではありません。gets
を他の機能に置き換えると、問題は変わりません。#include <stdio.h> int main() { char buf[16]; gets(buf); return 0; }
は、Iフラグ
-m32 -fno-stack-protector -z execstack -g
でプログラムを分解しgcc.godbolt.orgを使用:
このは、私が使用するソースコードです。バージョンとの逆アセンブルコードで
、gcc
> =
4.9.0:
lea ecx, [esp+4] # begin of main
and esp, -16
push DWORD PTR [ecx-4] # push esp
push ebp
mov ebp, esp
/* between these comment is not related to the question
push ecx
sub esp, 20
sub esp, 12
lea eax, [ebp-24]
push eax
call gets
add esp, 16
mov eax, 0
*/
mov ebp, esp
mov ecx, DWORD PTR [ebp-4] # ecx = saved esp
leave
lea esp, [ecx-4]
ret # end of main
しかし、gccの< 4.9.0だけのバージョンと:
push ebp # begin of main
mov ebp, esp
/* between these comment is not related to the question
and esp, -16
sub esp, 32
lea eax, [esp+16]
mov DWORD PTR [esp], eax
call gets
mov eax, 0
*/
leave
ret # end of main
私の質問は:カウ分解されたコードとそのメリットについてのこの相違点は何ですか?このテクニックの名前はありますか?
注:[gets()を使用しないでください。危険です](http://stackoverflow.com/q/1694036/2173917)。代わりに['fgets()'](https://linux.die.net/man/3/fgets)を使用してください。 –
これは最適化の結果です –
異なるコンパイラ構成。 'gcc -v'を使用して設定を比較する – LPs