构造带有堆栈保护的指令流

番茄系统家园 · 2022-03-17 07:54:42

1. 引言

我们在学ropgadgets与ret2syscall技术原理时,构造指令流时,是没有加堆栈保护的,比如下面的程序:

文件名:7.c

我们是这样编译的,是没有加堆栈保护的,之后再利用ropgadgets构造指令流,就可以成功去执行execve(“/bin/sh”,null,null);。

如果加上堆栈保护我们该怎么过呢?像下面这样编译:

显然我们就不能像原来一样构造指令流了,因为加入了堆栈保护。那我们该怎么办呢?我们可以利用格式化输出,将canary打印出来,然后再进行指令的组装。

2. 找地址

调试我们的程序,找到canary的地址,地址在:0xffffcfac

构造带有堆栈保护的指令流

继续调试,直到printf,我们看看现在canary据栈顶的位置:0060,除以4等于15,说明传给第一个read函数的值为:%15$08x,就可以将canary打印出来了

构造带有堆栈保护的指令流

重新调试,找到read函数把读进来的数据存放的地址:0xffffcf8c

构造带有堆栈保护的指令流

将%15$08x给read函数,发现可以将canary打印出来

构造带有堆栈保护的指令流

接下来就是利用好第二个read函数来构造rop链了。

3. 构造rop链

linux上系统调用原理:

  • eax 系统调用号
  • ebx 第一个参数
  • ecx 第二个参数
  • edx 第三个参数
  • esi 第四个参数
  • edi 第五个参数
  • int 0×80

所以eax就存放execve函数的系统调用号11,ebx存放第一个参数/bin/sh,ecx存放第二个参数null,就是0,edx存放第三个参数,也是0

地址用:0x080b8546

构造带有堆栈保护的指令流

地址为:0x0806f210

构造带有堆栈保护的指令流

地址用:0x080bbd80

构造带有堆栈保护的指令流

地址为:0x0806ce37

构造带有堆栈保护的指令流

4. 写出poc

从from pwnimport*到canary=canary.decode(“hex”)[::-1]都是为了找出canary,因为加了堆栈保护,我们不能直接把数据打入到堆栈中,所以要先找出canary,然后构造payload,我们要把canary加进去,过堆栈保护,再在后面加上我们的rop链。

执行成功

构造带有堆栈保护的指令流

5. 总结

开启了堆栈保护,加入了cookie,一旦我们破坏了堆栈,会引起系统保护,出现异常。但是我们还是需要构造我们的指令流,我们可以利用格式化输出,将canary打印出来,接下来我们可以利用读写函数,构造一个指令流,我们先去读,看一下堆栈的canary在哪里,然后我们canary搞出来,把canary再回填进去,进行组装,这样就即可以过堆栈保护,也可以构造我们的指令流了。

鸿蒙官方战略合作共建——HarmonyOS技术社区

免责声明: 凡标注转载/编译字样内容并非本站原创,转载目的在于传递更多信息,并不代表本网赞同其观点和对其真实性负责。如果你觉得本文好,欢迎推荐给朋友阅读;本文链接: https://m.nndssk.com/dngz/333654bfy869.html
猜你喜欢
最新应用
热门应用