C语言不命名函数调用execve
Calling a function in C without naming it
我和朋友试图在学校的自动评测系统中寻找万能解题方案,目标是获取任意shell代码执行权限。系统虽然允许运行代码,但严格限制只能使用题目指定的函数,像execve这样的系统调用直接会被拦截。我们推测系统通过AST分析代码,于是决定绕过命名限制。利用ASan(Address Sanitizer)替换标准库函数的特性,我们找到了一个始终被允许的printf函数,并计算它与mmap函数之间的固定内存偏移量。通过联合体(union)技巧绕过编译器对函数指针类型的严格检查,我们成功获取了mmap的地址,进而分配可读写执行的内存页,最终在不直接调用execve的情况下执行了任意系统调用。
在C语言中,不安全是一种特性,因此我们可以直接使用联合体来绕过编译器的限制。