練習用に ASM でいくつかの C 関数を書き直しています。私のmemset
機能はRAX
、レジスタに渡されたのと同じアドレスに設定されていRDI
ます。しかし、gcc はAL
の値をCDQE
命令で拡張しています。
char super[] = "suuuuuuuuuuper";
res = memset(super, 't', 4);
printf("memset = {%s} (%p) res = %p\n", super, super, res);
出力:
memset = {ttttuuuuuuuper} (0x7fffffd30250) res = 0xffffffffffd30250
に格納されているアドレスにアクセスしようとすると、セグメンテーション違反が発生しますres
。バイナリ ファイルを編集して、CQDE
呼び出しを 2 つのNOP
命令に置き換えるだけで、完全に実行されます。
しかし、その呼び出しを回避するための GCC フラグなど、他に何かあるのではないかと思っていました。