Skip to content

ez_jail

本题的原意是只考查 {} 在 C++ 里的(宏)替代运算符这个知识

只要关键词用得对,网上一搜就能搜到,但是被出题人执行坏了,测题时出现了一堆非预期。考虑了一下各个知识点的难度,感觉非预期的难度和预期解相差不大,就索性变成了一道半开放性的题目

我们观察代码的 check 函数

python
def cpp_code_checker(code):
    if "#include" in code:
        return False, "Code is not allowed to include libraries"
    if "#define" in code:
        return False, "Code is not allowed to use macros"
    if "{" in code or "}" in code:
        return (
            False,
            "Code is not allowed to use `{` or `}`,but it needs to be a single function",
        )
    if len(code) > 100:
        return False, "Code is too long"
    return True, "Code is valid"

这段代码看似过滤了 #include #define 等,但不知道同学们有没有意识到 # 后加空格就能绕过这里,也就是说可以通过宏定义来做到编译前预处理

所以 Payload 可以是这样(感谢 yuro 师傅提供解法)

cpp
# define user_code() write(STDOUT_FILENO, "Hello, World!", 13);

预期解是找到 C++ 的替代运算符的相关资料,然后使用 <% %> 替换{},Payload 如下

cpp
void user_code()<%write(1, "Hello, World!\n", 14);%>

除此之外,还可以使用指针,把 user_code() 变成一个空函数。输出的话可以通过定义一个全局变量接收输出函数的返回值来实现,其 payload 如下(感谢 c_lby 师傅提供解法)

cpp
int a=puts("Hello, World!");
int (*user_code)()=rand;

或者可以这样(感谢 KAMIYA 选手提供解法)

cpp
int x = (printf("Hello, World!\n"), 0);
using user_code = void(*)();