私は安全なコンピュータシステムコースを受講しています。ターゲットプログラム(target.cc)でバッファーをオーバーフローさせてシェルを取得する必要がある割り当てに問題があります。私はtarget.ccを変更することはできませんが、ターゲットファイルにパラメータを送ることができます。スタックガードをバイパスする - バッファオーバーフロー
ここにコードがあります。
#include <cstdio>
#include <cstring>
#include <cstdlib>
class SubStringReference
{
const char *start;
size_t len;
public:
SubStringReference(const char *s, size_t l) : start(s), len(l) { }
virtual ~SubStringReference() { }
virtual const char *getStart() const { return start; }
virtual int getLen() const { return len; }
};
void print_sub_string(const SubStringReference& str)
{
char buf[252];
if (str.getLen() >= sizeof buf)
{
// Only copy sizeof(buf) - 1 bytes plus a null
memcpy(buf, str.getStart(), sizeof(buf) - 1);
buf[sizeof(buf) - 1] = '\0'; // null-terminate
}
else
{
printf("by passed mem check\n");
// The length is less than the size of buf so just string copy.
strcpy(buf, str.getStart());
buf[str.getLen()] = '\0'; // null-terminate to get just the substring
}
puts(buf);
}
int main(int argc, char **argv)
{
if (argc != 4)
{
fprintf(stderr, "Usage: %s STRING START LENGTH\n", argv[0]);
return 1;
}
const char *s = argv[1];
int total_len = strlen(s);
int start = atoi(argv[2]);
int len = atoi(argv[3]);
if (start < 0 || start >= total_len)
{
fputs("start is out of range!\n", stderr);
return 1;
}
if (len < 0 || start + len > total_len)
{
fputs("length is out of range!\n", stderr);
return 1;
}
SubStringReference str(s + start, len);
print_sub_string(str);
return 0;
}
このプログラムはスタックガードで保護されているため、プログラムは復帰する前に中止されます。私はバッファをオーバーフローさせてシェルを得ることができる他の方法はありますか?
ありがとうございました。
編集 - 私はグラムとQEMUアームエミュレータでこれを実行しています++コンパイラ
スタックガードを削除してスタックからコードを実行できるようにするには、多少の設定が必要なことがあります。これは、使用するOSとコンパイラによって異なります。しかし、あなたはそれらの詳細を私たちに教えるのを忘れました。 –
すみません。私は質問を編集しました。私は割り当ての要件であるので、スタックガードを無効にすることはできません。私はスタックガードをバイパスする必要があります –
あなたのシステムにはどのくらいの大きさの 'int'がありますか? – ead