1

私は、バッファオーバーフローに対して脆弱なプログラムを悪用する宿題に取り組んでいます。これを行うには、大きなchar配列を作成し、最初に操作手順なしで完全に埋めます。

私がやるべきことは、悪意のあるコードをバッファのどこかにコピーし(この部分は問題なく実行できます)、悪意のあるコードがどこにあるかを指すように、悪用可能な関数のリターンアドレスをなんらかの方法で変更することだと思います。

設定したいアドレス(たとえば½¾¿º)はわかっていますが、警告が表示され、その原因がわかりません。

これは(本質的に)警告を引き起こしているコードです:

int start_of_return_address = 10;
chars[start_of_return_address + 0] = '½';
chars[start_of_return_address + 1] = '¾';
chars[start_of_return_address + 2] = '¿';
chars[start_of_return_address + 3] = 'º';

各割り当てについて私が受け取る警告は次のとおりです。

warning: overflow in implicit constant conversion
warning: multi-character character constant

bdbebfba(悪意のあるコードのアドレス)を文字(yielding )に変換してアドレスを取得しました½¾¿º

警告の原因となる可能性のあるアイデア、またはアドレスを文字配列にコピーする別の方法についてのアイデアはありますか?

これは宿題用ですのでご注意ください。

4

2 に答える 2

4

bdbebfbaからキャラクターへの変換は疑わしいと思います。

それがアドレスであり、それを文字配列に格納したい場合は、次のようにします。

chars[start_of_return_address + 0] = 0xbd;
chars[start_of_return_address + 1] = 0xbe;
chars[start_of_return_address + 2] = 0xbf;
chars[start_of_return_address + 3] = 0xba;

これは4バイトの値なので、 4文字収まります。

エンディアンも重要だと思います。システムがリトルエンディアン(x86)の場合、最下位バイトが下位アドレスに入ります(割り当ての順序が逆になります)。

chars[start_of_return_address + 4] = 0xbd;
chars[start_of_return_address + 3] = 0xbe;
chars[start_of_return_address + 2] = 0xbf;
chars[start_of_return_address + 1] = 0xba;
于 2012-04-11T10:59:29.810 に答える
1

表示されている文字リテラル ( '½''¾''¿''º') は、複数文字の定数として解釈されるべきではありません。私の推測では、それはエンコーディングの問題です: たとえば、ソースでは UTF-8 (したがって 2 バイト) としてエンコードされている可能性がありますが、コンパイラは別のエンコーディングを期待しています (あなたが想定した Latin-1 と言う - - 私が正しければ、それらは'½', '¾', '¿','º'と見なされるため、定数には 2 つの文字があると考えてください。

于 2012-04-11T11:22:32.887 に答える