由于Ubuntu18运行机制与前面版本的不同,在调用system的时候需要进行栈对齐
0x1 检查文件
- 64位elf
- 无canary
- 无PIE
0x02 流程分析
根据运行的流程,这个程序主要有两个功能,加密功能可以使用,但解密功能没办法使用,并且能够输入的地方就两个,一个选择程序,数字输入,第二个输入加密文本,字符串类型,之后的静态分析主要关注这两个地方。
0x02 静态分析
经过分析,主要漏洞点在加密函数之中,可以看到输入s时没有经过边界检查,存在栈溢出漏洞,搜寻程序也没有可用的后门函数,需要自己泄露libc版本并构建ROP链。
值得注意的是,函数里面有一个变量x,这个x代表这输入的数据是否需要加密,当我们输入字符串长度比原有x大的时候才会加密,加密函数很简单,只是一个异或操作,可以直接将语法改一下添加到exp里面。
0x04 思路分析
由于程序没有可用的后门函数,但有puts这个函数,就可以通过构造rop泄露出libc的版本和函数地址,利用LibcSearcher或者DynELF可以查到libc的版本,之后获取libc里面的地址构造ROP链,获取shell。
由于两次的payload长度是一样的,加密函数里面的x经过第一个payload之后,值已经改变,第二次payload输入是不会被加密的,可直接使用。
exp
from pwn import *
from LibcSearcher import *
def encrypt(string):
newstr = list(string)
for i in range(len(newstr)):