使用免费工具进行逆向和利用:第14部分
原作者:Ricardo Narvaja
翻译作者:梦幻的彼岸
更新日期:2022年1月21日
正如我们在以前的教程中所看到的,创建一个rop可能很容易,也可能非常困难,这取决于漏洞的类型,我们看到的4个问题告诉我们困难的程度。
根据前一部分的4个问题的例子,我们来看看:
1)你有没有ASLR模块?-是的。
2)你是否在一个没有导入ASLR的模块中设置了VIrtualAlloc或VirtualProtect函数?-是的
3)数据是否已经位于堆栈中,以便开始运行?-是的。
4)我可以传递任何字符,所以没有无效字符?没有-但影响不大
我们可以在0到4之间打分,每没有一个就加一分。
当然,0级ROP乍一看会更容易,而4级可能会变得非常困难或不可能,这取决于具体情况,尽管在以后的实践中可能会有一些变化。
我们看到的前一个是级别1,尽管实际上它们对无效字符的影响非常小,所以在已经完成的情况下,我们可以只添加0.5而不是1,因为它几乎没有受到影响,根据ricnar Heje的等级,这最终会给我们一个0.5的分数。
好的,我们有下面两个32位和64位的例子,在我们转向ropear之前,首先我们将分析ROP的难度。
分析第二个32位练习的难度
https://drive.google.com/open?id=1IMiq0AqErEzWOiq78l0hA4Mb9S80RGXb
让我们来回答问题:
1)你有没有ASL的模块?
我们运行,当messageboxa退出时,我们将在Process Explorer中查看是否存在没有ASL的模块。
点击并按住并转到MessageBoxA窗口,松开,它将显示它所对应的进程。
它启用了DEP,所以要解决这个问题,我们必须建立一个ROP,而且它有一个没有ASLR的模块(可执行文件本身的模块),所以第一个问题的答案是YES,所以我们不加(记住,每个NO我们只加1)。
SCORE PARCIAL =0
2)你是否在一个没有导入ASLR的模块中设置了VIrtualAlloc或VirtualProtect函数?
我们将使用RADARE首先打开32位的例子。
我在它所在的文件夹中打开一个cmd,然后输入
r2 ConsoleApplication9.exe
我用idp命令来加载符号
idp ConsoleApplication9.pdb
然后用aaa来分析这个方案。
afl已经准备好了。
如果我们要过滤radare,它有一个GREP包含使用符号~
让我们用s pdb._main进入主界面。
我用Ps ROP32创建了一个项目
使用eco bright增强视觉效果。
使用agf我可以看到功能块,这对我来说已经足够了。
用eco bright更明显。让我们用s pdb._mainI去看main,我们在前面的练习中对VirtualAlloc的调用没有了,这让我们的工作更容易了,因为这个函数被导入了,让我们列出导入的函数,看看我们是否有它,用ii命令,用~过滤。
我们看到这并不重要,所以答案是NO。
SCORE PARCIAL= 1
3)数据是否已经在堆栈中,以便开始运行?
要看到这一点,我们必须分析这个漏洞,在main函数中,你看不到任何东西,也许它就在名为f的函数里面。
我们可以用s pdb._f看到函数f。
但最好使用视觉模式,用v进入,按c控制光标,用方向键下到函数f的调用处并按回车键。
在视觉模式下,用c退出光标模式,然后按空格键查看下图框选区域。(再按一次空格键就可以返回)。
我们看到三个变量,最上面的一个与下一个有相当大的差距,所以它一定是堆栈中的一个缓冲区。
它位于ebp的-0x408处,下一个变量位于ebp的-0x8处,有0x400字节的差异,这是缓冲区的长度。
在可视模式下,我也可以按:,然后用afvn buffer var_408h命令重命名。
然后再去刷新一下。
正如我们所看到的,按c键用方向键控制光标(c键退出光标模式)。
我用方向键走到我想注释的那一行,然后按;,添加注释,然后按ENTER。
在这些可视化模式命令中,不需要刷新。
我们看到它在var_8h中存储了缓冲区的指针,我将把这个变量重命名为buffer。
紧接着:输入afvn pbuffer var_8h然后是按v。
我们看到里面有一个循环,它在每次重复中用getchar函数读取字符,将其保存在变量var_1h中,这是一个单字节变量,然后将其与0x40和0x10进行比较,如果是这两个值中的一个出来,否则就将其保存在缓冲区,因为它将pbuffer读到ECX,然后将其保存在其内容或缓冲区中。
我们看到没有保护cookie,所以我应该填充bufffer,单步到返回地址(jeje)(嘿嘿),直到找到一个0x40或0x10的字节并退出,所以问题的答案是YES,既然我的数据在堆栈中,我是否可以直接从堆栈中提取数据。
SCORE PARCIAL =1
4)我可以传递任何字符,即没有无效的字符吗?
正如我们能够分析的那样,如果我们想完成复制,我们只能传递0x40或0x10字符,所以在形成ROP的堆栈中复制的数据不能有0x40或0x10,与shellcode相同,所以答案是NO,我们将看到它是否影响很大,现在我们在分数上加一。
SCORE FINAL =2
我们可以看到,这个部分分析告诉我,这个SCORE=2的ROP,应该比我们之前看到的SCORE为0.5的ROP更复杂。
我们将用afvn temp_char var_1h然后用v重命名变量并更正其类型。
为了改变类型为char,我们将使用命令afvt temp_char char,然后是v。
我将用ps ROP32保存该项目,以便在下一部分继续进行,并且因为我希望你们尝试并且不要害怕失败只不过是一个简单的练习而已。
帮助他们尝试解决的提示
提示---->当复制到缓冲区下面的pBuffer堆栈时要小心,可能会中断,最后崩溃,不允许他们到达返回地址。
- 左青龙
- 微信扫一扫
-
- 右白虎
- 微信扫一扫
-
评论