首页
社区
课程
招聘
[原创]CVE-2014-9707分析以及exp构造
2016-7-3 15:05 6412

[原创]CVE-2014-9707分析以及exp构造

2016-7-3 15:05
6412
技术有限,分析粗糙,欢迎拍砖。
exp没有绕过aslr和nx,我想是否能通过目录遍历来读取maps文件,获取当前进程内存信息,来达到绕过aslr?望大牛告知此想法的可行性

求精华

[培训]内核驱动高级班,冲击BAT一流互联网大厂工 作,每周日13:00-18:00直播授课

上传的附件:
收藏
点赞1
打赏
分享
最新回复 (12)
雪    币: 292
活跃值: (680)
能力值: ( LV6,RANK:90 )
在线值:
发帖
回帖
粉丝
Keoyo 2 2016-7-12 09:09
2
0
想请教一下楼主,nextsize这里是如何利用的。。。
雪    币: 90
活跃值: (148)
能力值: ( LV5,RANK:60 )
在线值:
发帖
回帖
粉丝
fneig 1 2016-7-12 09:51
3
0
glibc 2.19 unlink
#define unlink(P, BK, FD) {                                            \
    FD = P->fd;                                      \
    BK = P->bk;                                      \
    if (__builtin_expect (FD->bk != P || BK->fd != P, 0))              \
          malloc_printerr (check_action, "corrupted double-linked list", P);      \
    else {                                      \
        FD->bk = BK;                                  \
        BK->fd = FD;                                  \
        if (!in_smallbin_range (P->size)                      \
            && __builtin_expect (P->fd_nextsize != NULL, 0)) {              \
            assert (P->fd_nextsize->bk_nextsize == P);                  \
            assert (P->bk_nextsize->fd_nextsize == P);                  \
            if (FD->fd_nextsize == NULL) {                      \
                if (P->fd_nextsize == P)                      \
                      FD->fd_nextsize = FD->bk_nextsize = FD;              \
                else {                                  \
                    FD->fd_nextsize = P->fd_nextsize;                  \
                    FD->bk_nextsize = P->bk_nextsize;                  \
                    P->fd_nextsize->bk_nextsize = FD;                  \
                    P->bk_nextsize->fd_nextsize = FD;                  \
                  }                                  \
              } else {                                  \
                P->fd_nextsize->bk_nextsize = P->bk_nextsize;              \
                P->bk_nextsize->fd_nextsize = P->fd_nextsize;              \
          }                                      \
      }                                      \
  }                                          \
}


看这里
              } else {                                  \
                P->fd_nextsize->bk_nextsize = P->bk_nextsize;              \
                P->bk_nextsize->fd_nextsize = P->fd_nextsize;              \
          }                                      \


P->fd_nextsize:你想覆盖的地方 - 20(bk_nextsize在结构偏移20的字节的地方)
P->bk_nextsize:shellcode地址。
要注意的是,在shellcode偏移16字节的地方,会有4个字节会被覆盖,在我的exp代码中,我使用jmp跳过这一块地方。
雪    币: 292
活跃值: (680)
能力值: ( LV6,RANK:90 )
在线值:
发帖
回帖
粉丝
Keoyo 2 2016-7-12 16:25
4
0
哦哦!非常感谢,其实想覆盖的那个地方就是返回地址咯?然后程序返回直接跳转到shellcode的地方?是这样吗?网上对新版本unlink宏的利用方式所述很少,非常感谢指点!
雪    币: 90
活跃值: (148)
能力值: ( LV5,RANK:60 )
在线值:
发帖
回帖
粉丝
fneig 1 2016-7-12 17:48
5
0
在我的exp中,被覆盖的地方是函数的返回地址,当程序返回时,就会跳到shellcode执行。
雪    币: 292
活跃值: (680)
能力值: ( LV6,RANK:90 )
在线值:
发帖
回帖
粉丝
Keoyo 2 2016-7-12 20:56
6
0
明白了,明天我再调试一下,多谢大牛指点!
雪    币: 292
活跃值: (680)
能力值: ( LV6,RANK:90 )
在线值:
发帖
回帖
粉丝
Keoyo 2 2016-7-14 08:32
7
0
还想请教一下楼主,在调试过程中发现了一个比较奇怪的,同样我也是glibc 2.19,但是按照您的说法构造了一个exp,调试的时候会中断报错

_int_free: Assertion `nextchunk->fd_nextsize->bk_nextsize == nextchunk' failed


不知道是什么原因。。。
雪    币: 90
活跃值: (148)
能力值: ( LV5,RANK:60 )
在线值:
发帖
回帖
粉丝
fneig 1 2016-7-14 08:41
8
0
看样子是断言失败了,你编译glibc的时候启用debug了?
雪    币: 292
活跃值: (680)
能力值: ( LV6,RANK:90 )
在线值:
发帖
回帖
粉丝
Keoyo 2 2016-7-14 09:25
9
0
难道是编译环境的问题?我用的是kali2.0版本,应该是没有启用debug吧。。我换一个和你一样的系统版本再调试一下试试。。感谢!
雪    币: 292
活跃值: (680)
能力值: ( LV6,RANK:90 )
在线值:
发帖
回帖
粉丝
Keoyo 2 2016-7-14 11:40
10
0
大大您好,我又仔细分析了一下unlink宏,发现你提到的那一部分else语句,是之前的if语句不成立才能进入,也就是说P->fd_nextsize=null才能进入。。这一部分在exp中并没有体现,我的问题可能也是出现在由于满足条件,所以直接进入if语句中,从而造成某一步判断没有通过产生的断言错误。

所以还是想麻烦您能不能再详细的说一说这一部分。。。large chunk的利用以前从来没接触过,实在很想搞明白。。
雪    币: 90
活跃值: (148)
能力值: ( LV5,RANK:60 )
在线值:
发帖
回帖
粉丝
fneig 1 2016-7-14 13:34
11
0
assert在定义了NDEBUG宏时,就不会生效
雪    币: 90
活跃值: (148)
能力值: ( LV5,RANK:60 )
在线值:
发帖
回帖
粉丝
fneig 1 2016-7-14 13:36
12
0
              } else {                                  \
                P->fd_nextsize->bk_nextsize = P->bk_nextsize;              \
                P->bk_nextsize->fd_nextsize = P->fd_nextsize;              \
          }   

这一部分的需要FD->fd_nextsize != NULL才能进入啊。断言在这个if之前。一般情况下,Relase版本的程序都不会启用assert的。
雪    币: 5651
活跃值: (6653)
能力值: ( LV15,RANK:531 )
在线值:
发帖
回帖
粉丝
houjingyi 11 2017-5-18 10:45
13
0
想请教一下楼主怎么关闭linux系统的NX
游客
登录 | 注册 方可回帖
返回