软件安全hw2
软件安全hw2
首先利用checksec进行检查
|
|
发现该文件使用了UPX壳。
利用upx
脱壳。
|
|
利用ghidra分析程序。通过entry中__libc_start_main
的第一个参数定位到main函数的地址0xcb0
。
|
|
其中存在大量的含义不明的字符串,推测其内容经过加密。在将其作为参数传递给函数前都利用FUN_00100af0
进行了处理,推测FUN_00100af0
为解密函数。
|
|
此处采用了明显的异或加密。利用python写出对应的解密脚本。
|
|
利用rizin
从程序中dump出加密后的字符串的内容,解密后得到明文。
|
|
|
|
结合这一分析结果回顾main函数逻辑,可知其首先读取环境变量SH_COLOR
的值,其后存在两条路径,第一条路径执行mkfifo
,第二条路径执行/bin/sh
。为了利用该后门,显然我们需要找到一种输出使其执行第二条路径。
分支前执行了检查
|
|
我们需要使得该条件不成立,即首先环境变量SH_COLOR
的值不为空,然后函数FUN_00100b34()
的返回值为0.
|
|
结合上面解密得到的字符串明文,我们看到在该函数最后执行了memcmp,将执行一系列操作之后的字符串与从0x1640
开始的32个字节,进行比较。
|
|
我们注意到函数FUN_00101145()
的内容,
|
|
向内存中放入了一段特殊的数据。我们在google中搜索0x6a09e667
得到大量与sha256相关的词条,推测这里使用了sha256求hash,而最终用于比较的长度为32字节的字符串也符合我们的这一猜测。
hash算法并不可逆,不能手动写逆变换求解,采用彩虹表进行攻击。
得到结果000000149100020803781papoc
。
这里的papoc与我们解密的buf20a8
的值一致,分析FUN_001011bf
函数,其作用为将两个字符串进行拼接。
综上所述,我们需要将000000149100020803781
作为环境变量SH_COLOR
,即可成功触发backdoor。
由于程序在执行过程中需要进行setuid(0)
的操作需要权限,我们将其变成一个setuid程序后执行,最终成功拿到rootshell。
|
|