当前位置:首页 > 电脑常识 > 正文

7547分析及操作 8090安适门户

11-22 电脑常识

0x01 分析
这个缝隙分析及如何搭建测试环境k0师傅在seebug上以及mrh大神在drops的文章都写的非常详细,不才面参考中附上了原文地点。我就站在巨人的肩膀上写一些本身在7547分析上的一些环节。本文的重点是后续如何去编写列用exp,为了编写exp在调试中需要弄清楚很多工作,包孕劫持eip的位置,栈空间构造等。下面我们就一一道来。
1.寻找缝隙触发点
谷歌给的POC很长,运行POC后gdb调试,追寻缝隙出发点。
按照缝隙触发流程,在阅读源代码后,我们分袂对以下函数下断
$b _nss_dns_gethostbyname4_r (/opt/glibc-2.20/resolv/res_dns/dns-host.c)
$b __libc_res_nsearch (/opt/glibc-2.20/resolv/res_query.c)
$b __libc_res_nquery (/opt/glibc-2,20/resolv/res_query.c)
$b __libc_res_nsend (/opt/glibc-2,20/resolv/res_send.c)
$b send_vc (/opt/glibc-2,20/resolv/res_send.c)
后面是源码位置,便利大家阅读。
在send_vc停下后,我们用bt看下挪用栈:

一切正常,finish完成此函数,发明poc窗口发送了请求,同时再看栈段发明


在send_vc源码中,主要问题呈此刻这里


结束send_vc后,通过单步调试n,锁定在nquery中这几行的

我们知道了第二次POC发送的数据才是造成溢出的关键地址,google的验证POC中第二次发送的数据加上了2300个B,也就是我们后续编写操作exp大施拳脚的处所

2.寻找可被劫持的EIPEIP位置
我们知道,想劫持措施流程就要去劫持EIP,劫持EIP就要找ret。所以我们首先要弄清整个的栈构造。
我们在gethostbyname4_r函数中运行完分配空间这行代码后

直接打印这个变量

这个就是我们2300个B的地址的起始位置,我们溢出后来看一下

这也就是我们的栈顶,那么返回地点在哪儿呢?只要在gethostbyname4_r中在分配这2048之前打印下esp就知道啦

剪头指向的就是我们要劫持的EIP处。
目前已知的栈空间如下

中间那堆????是否要弄清,我们来做个试验,发送小于(2048 + 108 )2156 个B,在不笼罩Ret的情况下,措施能继续执行吗?
改削poc,发送2150个B,run

发型措施并没有继续中断,这说明栈空间中的“????”区域还是有要用的参数的,这个大坑就需要慢慢来填了………
这里有一点要注意,我们上面这个图中栈的地点是gdb调试环境,和真实环境是不一样的,但是栈的结谈判真实环境是一样的,所以我们只需要在真实环境下看下dump下来的core文件找到栈头的起始地点,再按照差值计算其他的就可以了。

发明真实环境下的栈顶为0xbfffe240,与gdb下的0xbfffe220差了0x20。
继续去探查栈空间
3.摸清栈空间
我们可以看到停在这一行

再看nquery源代码可发明

温馨提示: 本文由杰米博客推荐,转载请保留链接: https://www.jmwww.net/file/pc/13353.html

博客主人杰米WWW
杰米博客,为大家提供seo以及it方面技巧喜欢的朋友收藏哦!
  • 11365文章总数
  • 1378074访问次数
  • 建站天数
  •