<?php

$MY = create_function("","die(`cat flag.php`);");
$hash = bin2hex(openssl_random_pseudo_bytes(32));
eval("function SUCTF_$hash(){"
    ."global \$MY;"
    ."\$MY();"
    ."}");
if(isset($_GET['func_name'])){
    $_GET["func_name"]();
    die();
}
show_source(__FILE__);

代码很简洁粗暴,开头就创建了一个全局函数,可以查看flag。

create_function生成的函数名有些特殊,它是NULL字符加上”lambda_”再加个一个数字标识(\x00lambda_数字标识),其中数字标识代表它是当前进程中的第几个匿名函数。create_function的实现步骤如下:

  1. 获取参数, 函数体
  2. 拼凑一个”function __lambda_func (参数) { 函数体;} “的字符串
  3. eval之
  4. 通过__lambda_func在函数表中找到eval后得到的函数体, 找不到就出错
  5. 定义一个函数名:”\000_lambda_” . count(anonymous_functions)++
  6. 用新的函数名替换__lambda_func
  7. 返回新的函数名

已知它的格式是固定的,所以可以爆破它: