欢迎来到尧图网

客户服务 关于我们

您的位置:首页 > 汽车 > 时评 > [Hello-CTF]RCE-Labs超详细WP-Level10(无字母命令执行_二进制整数替换)

[Hello-CTF]RCE-Labs超详细WP-Level10(无字母命令执行_二进制整数替换)

2025/3/16 19:20:23 来源:https://blog.csdn.net/qq_39673370/article/details/146203127  浏览:    关键词:[Hello-CTF]RCE-Labs超详细WP-Level10(无字母命令执行_二进制整数替换)

温馨提示

  • 这关涉及的知识点较多, 写的很长, 中间留了很多错误引导(本人在实验时遇到的问题, 或许你们也会遇到), 在后文才逐步解释

源码分析

  • 跟前几关一样, 更改了 WAF 的过滤字段
  • 这个关卡, 只有0, 1, '(单引号), $, <, \ , ( , )可以用

解题分析(实验这些命令, 可以先在自己本地的Bash试试)

  • 上一关使用 八进制, 而这一关只有 01, 难道使用二进制?
    • 没错
  • bash 终端中, 支持使用 $((2#binary))来通过二进制表示十进制数
    • 比如
      $((2#10011010)) -> 154
      
  • 虽说知道了 $((2#binary)) 可以把二进制转为十进制, 但是还是把它拆分开来分析一下
    • 首先是 $((...))
      • bash$((...))算术扩展(Arithmetic Expansion) 的语法
      • 比如
        echo $((3 + 5))   # 输出 8
        echo $((10 / 2))  # 输出 5a=10
        b=5
        echo $((a + b))  # 输出 15
        
    • 2#binary进制表示法(Base Notation), 表示把后面的二进制串, 转化为十进制
      • 同理 # 前面的 2 也可以是 8, 16, 36, 如下
      echo $((8#72))  # 输出 58
      echo $((16#1A))  # 输出 26
      echo $((36#Z))  # 输出 35
      
  • 熟知 $((2#binary)) 的原理, 是否会发现, 这里不是有个 2 吗, 怎么绕过 WAF 呢
    • 其实只要在嵌套一层 $((...)) 就可以
    • 可以只使用 1< 通过左移运算得到 2
      • $((1<<1))
    • 所以 $((2#binary)) 可以写为 $(($((1<<1))#binaryStr))
  • 然后把 $(($((1<<1))#binaryStr)) 套入到八进制转义中, 这里拿 ls 举例
    • 注意的是, 这里的 $((2#binary)) 不是直接转为八进制数, 而是转为十进制的数, 而这个十进制数当做八进制使用, 转换步骤详细如下
      ls 转为八进制 -> \154\163
      使用八进制转义 -> $'\154\163'
      使用二进制替换 154 和 163, 这两个数现在当做十进制154 -> $((2#10011010)) -> $(($((1<<1))#10011010))163 -> $((2#10100011)) -> $(($((1<<1))#10100011))
      于是 $'\154\163' -> $'\$(($((1<<1))#10011010))\$(($((1<<1))#10100011))'
      
  • 但是使用 $'\$(($((1<<1))#10011010))\$(($((1<<1))#10100

版权声明:

本网仅为发布的内容提供存储空间,不对发表、转载的内容提供任何形式的保证。凡本网注明“来源:XXX网络”的作品,均转载自其它媒体,著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处。

我们尊重并感谢每一位作者,均已注明文章来源和作者。如因作品内容、版权或其它问题,请及时与我们联系,联系邮箱:809451989@qq.com,投稿邮箱:809451989@qq.com

热搜词