2011-11-13 14 views
0

最近この本を購入した:ハッキング:The Art of Exploitation(2nd Edition)これは最近非常に厄介なことでした。とにかく、例の一つ、firstprog.cで:ハッキングからの悲しみ:搾取のテクニック

#include <stdio.h> 
int main() { 
int i; 
for(i=0; i < 10; i++) { 
// Loop 10 times. 
printf("Hello, world!\n"); // put the string to the output. } 
return 0; // Tell OS the program exited without errors. } 

それはあなたが(明らかに:3)のgccでコンパイルした、この私だけの使用gobjdumpのために(objdumpの使用、OSのためにobjdumpは見つけることができませんでしたX)grepへの出力をmain:でパイプします。正規表現として最初の20行を表示します。その後、gdbでデバッグし、mainでブレークします。 ここに私の主な問題があります:すべてのメモリアドレスが異なります! たとえば、本のeipは0x804837aです。しかし、私のコンピュータではリップがあります:0x100000ee8私はそれが64ビットOSを使用していると思っていましたが、32ビットバージョンのダーウィンで起動したときにも同じ結果が得られました。誰かがこの問題が何であるか知っていれば、私は大いに感謝しています。それが本当にばかげて何か休憩を与えるならば、私はちょうど14になった:

答えて

2

あなたが得るアドレスは、ほとんどいつも彼らが本に示すアドレスと異なるでしょう。あなたの同じシステム上の異なる実行間でアドレスが変わる可能性があります。

4

あなたがリバースエンジニアリングを学んでいると確信しているので、ASLRが何であるかを調べるべきです。つまり、のメインは、プログラムのオフセットが本のオフセットと異なる理由です。基本的には、プログラムがメモリ上にある場所をランダムにするので、アドレスをシェルコードにハードコードするエクスプロイトを作成することはできません。これにより、悪用をもっと難しくすることができます。

+0

うわー!それはかなり甘いです、私はそれについて知りませんでした、ありがとう! – jaykru

+0

gdbにASLRを無効にするオプションがありますが、私はまだ同じアドレスを持っていませんか? – jaykru

+0

gdbを使ってASLRを無効にすることはできません。 http://stackoverflow.com/questions/6325537/disabling-aslr-in-mac-os-x-snow-leopardを参照してください。ASLRが無効になっている場合、書籍で使用されているOSのバージョンがあなたとは違う – JosephH