首先,我感谢每一位在我学习路上帮助我的每一个人。
谢谢你们。
进入正题,今天带领大家看一个比较有趣的一个exploit。
这个exp的目的是展示伪造栈的技术,也就是自定义一个新栈,我认为挺有趣的。
这个思路也是我的一位帅气的硕士学长告诉我的,我来分享给大家。
首先,题目链接在此:https://pan.baidu.com/s/1GEpaUWTb9zCukCgg4bDxWg
密码:dfkh
首先,我们运行一下该程序

我们可以看到,应该是需要输入一些东西,我随便打了写字符,回车,出现hello,world。

可以初步得出,应该存在栈溢出的漏洞,我们checksec一下。

32位,没有任何的保护。
拉入IDA查看。
main函数伪C代码

里面两个很简单的函数,进入第一个发现栈溢出漏洞。

很简单吧,但是在这里要介绍一种伪造栈的方法。

看上面的exp,
由于什么保护都未开启,所以栈上的数据是可执行的。
好,接下来我们分析这个exploit。

这个实际上是shellcode,理解吧。

第一个ret,让我们在ida看一看在什么位置。

大家注意到没有?很容易理解吧.
接下来的ebp就是我们要创建伪造栈的栈底。是0x804a010

可以看到,上面地址上是这些个玩意。
我们分析这个payload

前面的都不做重点讲解了,重点是标注箭头的部分。
第一个红箭头指向的其实就是我们要伪造栈的栈底,第二个红箭头指向的目的是为了使EIP指向ret=0x804841f地址,执行。
其作用会在接下来跟进讲解。

相信大家也注意到了,该exp有两个interactive,所以,运行时也需要特殊一点,即当第一次interactive时按下ctrl+c中断一下,目的是为了不让第二次发送的payload被错误的认为是第一次发送的payload的后续(这里要感谢我的贾学长,表达我深深的谢意。)
目前为止,我们已经简单分析了exp的构造,接下来,我们要步步跟进,深入探讨。
当我们debug时,如下图,可以看到已经发送了payload

我们在gdb里查看一下栈是否发送到位,如下图

可以看到,已经成功发送。我们继续。

当执行到上面那一步后,堆栈情况是这样的。

寄存器情况是这样的。

注意,再次执行下一条指令leave后,观察堆栈和EBP

我们发现,EBP已经成为我们预想的伪造栈的栈底了。
而下一个pop也是按我们预期的指向。
这里插入一个对leave指令讲解

好,我们继续执行下去观察
了解leave后,当第二次,即ctrl+c后执行到leave后,我们看一看前后EBP和ESP变化。


我们发现,我们定义了一个新的栈给了这个进程。
我们再看栈中保存的数据,

实际上到这里,伪造栈的技术也就讲完了,当然,伪造栈这个说法只是我个人创造的而已,但是也挺新奇的对我来说,当我第一次看到时,心里确实很惊讶,原因是原来栈还可以这么玩。
关于该exp怎么getshell不是我要讲的重点,相信大家也很容易理解其原因。
原创不易,点个赞吧,
欢迎转载,转载标注。
网友评论