我正在搜索“坏/坏”的c代码,我可以在基于mcu的系统上测试错误处理程序。
我正在搜索在运行时会中断的代码。
所以发疯了,你的后袋里有什么小块代码可以用来打破系统。并且应该由错误处理程序处理以避免不受控制的行为。
/感谢
我将从几个例子开始。
写入空指针
int* pointer = 0x0;
*pointer = 0xBAADC0DE;
将值写入无效的指针
int* pointer = 0xCAFEBABE;
*pointer = 0xDEADBEEF;
跳转到无效的函数指针
int (*fpBabe)() = 0xDEADBABE;
fpBabe();
那么你可以在错误处理程序中抛出一些更糟糕的东西吗?
答案 0 :(得分:2)
除以零(以及简单的数学运算,以便在编译器尝试优化它时):
int i = argc;
return 34/(argc-i);
尝试访问高mem地址,以及低地址:
char *v = ~0;
*v = '\0';
如果您有一个堆mgmt库,请尝试释放两次:
char *ptr = malloc(4096);
free(ptr); free(ptr);
尝试分配内存而不放弃:
for(;;)
malloc(4096);
尝试耗尽筹码:
int foo(int arg) { return foo(arg+1); }
int main(int a, char *v[]) { return foo(1); }
答案 1 :(得分:2)
int f() { return f() + f(); }
int g() { return g(); }
int h() { while(1); }
答案 2 :(得分:2)
通过相互递归来排出堆栈(可能更难检测):
int f(void) { return g(); }
int g(void) { return f(); }
int main(void) { return f(); }
......或通过有趣的信号处理:
void handler(int n) { raise(n); raise(n); }
int main(void) { signal(SIGINT, &handler); raise(SIGINT); return 0; }
销毁堆:
for (char *x = malloc(1); *x++ = 42;);
销毁堆并责备free():
char *x = malloc(1);
for (int i = 0; i < 100; x[i++] = 42);
free(x); // free() will probably segfault
答案 3 :(得分:1)
写过缓冲区的末尾:
char dest[5];
const char* src = "a bigger source";
strcpy(dest,src);
或
dest[5]='\0';