对 Shell 中 $(()) 操作的研究

$(())是用来作整数运算的,详情参考 https://wiki.jikexueyuan.com/project/13-questions-of-shell/eight.html

今天在做一道题的时候,出题人给出的 WP 将 $(()) 套娃,成功构造出奇怪的 payload getshell,一开始以为 $(()) 只是单纯将里面的所有 $(()) 相加,后来无意间随便测了测别的数据发现与应该的预期并不一样,所以就测试了个把小时,差不多摸清楚了在 $(()) 里套娃 $(()) 的情况

Analysis

$(($(($a))$(($b))$(($c))$(($d))$(($e))$(($f)))) 为例子吧:

含有任何负数的情况

只要有任意 $(($n)) 为负数,则表达式的结果为:

比如:$(($((1))$((0))$((-1))$((1))$((2))$((1)))) 的情况:

或者:$(($((-1))$((0))$((-1))$((1))$((2))$((1))))

亦或者:$(($((6))$((0))$((-1))$((1))$((-3))$((1))))

$(($a)) 为 0 的情况

$(($a)) 为 0,且其它都为非负数时,整个表达式的结果最后为:

全部为正数的情况

如果所有的 $(($n)) 都为正数,则全部拼接在一起输出……

CTFSHOW WEB入门 51

所以我们可以随意构造了,虽然题目给我们滤掉了字母数字,但是无所谓,首先有 $(()) 为 0,我们取个反,$((~$(()))) 为 -1,那我们只需要加到 -37 最后取个反就好咯

最后构造出的 payload: