BUGKU_PWN_OVERFLOW2_WP

发布时间 2023-06-10 19:14:16作者: Anime_Bucket

WP_OVERFLOW2

 

拿到程序,首先放到我们的kali里面看看是多少位的程序,然后在看看有没有什么安全属性

64位程序,并且开启了RELRO,NX

也就是说,这道题我们需要使用ROP绕过

 

使用ida64打开这个程序,对这个程序的伪代码进行分析

 

 

首先看看main函数

 

发现最开始定义的buf是32个字节

然后在memset中讲buf给清空了,然后read函数讲100字节的数据丢给了buf,这里可以产生栈溢出漏洞

 

我们在函数列表中可以发现我们无法找到/bin/sh这个函数,这里有两个方法可以找到bin/sh

  1. shift+F12,可以找到一些关键词
  2. 使用ROPgadget进行过滤

 

我们看第一种方法的效果

 

然后我们在看到第二种方法的效果

 

知道了/bin/sh的地址以后

我们还需要找system的地址

 

现在我们有了system的地址,/bin/sh的地址也有的,我们要将/bin/sh的地址传递给system需要知道RDI寄存器的地址

这里是这样解释的

system()函数的第一个参数需要通过RDI寄存器传递。如果没有使用pop rdi; ret的ROP gadget,就无法将/bin/sh字符串的地址加载到RDI寄存器中,也就无法调用system()函数。

 

这里我们需要继续使用到ROPgadget了

 

为什么是POP rdi而不是直接rdi

原因:pop rdi 是一条汇编指令,它的作用是将栈顶的值弹出并存储到寄存器 RDI 中。而 rdi 是 RDI 寄存器本身。

 

Exp构造: