7547分析及操作 8090安适门户
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