このように、完全にテストされていない場合、制限の問題がある可能性があります。スタックポインタがPUSHINGによって減少する場合にのみ機能します。したがって、これはすべてのハードウェアで移植できません。
#include <stdlib.h>
#include <string.h>
#define STK_CNT 65536
size_t STK_fill()
{
volatile size_t i, cnt = 0;
volatile u_int32_t fill[STK_CNT];
for(i = 0; i < STK_CNT; i++)
{
fill[i] = 0xDEADBEEFUL;
}
return cnt;
}
size_t STK_find()
{
volatile size_t i, cnt = 0;
volatile u_int32_t fill[STK_CNT];
for(i = 0; i < STK_CNT; i++)
{
if(fill[i] == 0xDEADBEEFUL)
{
cnt++;
}else{
break;
}
}
return ((STK_CNT - cnt) * 4);
}
void victim(char *po_str, const char *pi_str)
{
char str[1024];
strcpy(str, "stk_TEST_");
strcat(str, pi_str);
strcat(str, "_stk_TEST");
strcpy(po_str, str);
}
int main()
{
int temp;
int used;
char str[4096] = {0};
temp = (int)STK_fill();
victim(str, "STK_tst_STK_tst_STK_tst_STK_tst_STK_tst_STK_tst_STK_tst_STK");
used = (int)STK_find();
printf("VICTIM function used %d bytes of stack\n", used);
return 0;
}
あなたのアイデアは素晴らしいと思います。 –
「その他のアイデア?」と思っていますが、あなたのアイデアは良いと思いますが、代わりに言えば、プログラム内のメモリ領域から読み取り/書き込みの許可を取り除くことができるOSがありますsome_func_calledが落ちるまで使用可能なスタックスペース。スタックが潜在的に成長する場所を知っているか、推測する必要があります(あなたの「既知のパターン」のアプローチの問題もあります)。また、some_func_called()を複数回呼び出すことができない場合や、呼び出しごとに同じ量のメモリを使用しない場合、あなたは失敗点で磨きをかけながらアプリケーションを再実行する必要があります。 –