[DH] honest
Writeup
2025. 8. 15.
Introduction
honest 문제에 대한 writeup입니다.
분석
ida로 뜯어보면 calcuate 후 나온 값을 비교하고 다음 verify 함수로 넘어가는 구조가 반복된다. 따라서 calculate를 리버싱하고 각 함수들에 맞게 찾아줘도 되지만, 어차피 64비트 각 바이트에 대해서 반복연산을 하는거라 로 부르트 포스가 끝난다. 정확히는 printable char의 수만큼만 반복하면 된다.
gdb의 python scripting을 이용해서 구해주자.
python을 이용한 gdbscript가 처음이라 코드가 제일 어려웠다
코드 (일부만)
import gdb # type: ignore
import pwn
import string
위 라이브러리를 사용했다.
func = [elf.sym[f"verify_func_{idx}"] + gdb_base for idx in range(63) if idx != 28] + [
0x0055555555526F
]
update = [elf.sym[f"verify_func_{idx}"] + gdb_base + 0x66 for idx in range(63)] + [
0x00005555555552F5
]
프로그램의 entry point가 main
이 아님에 유의하여 브루트포스를 해주었다.
아래처럼 훅을 설정한 후 플래그를 획득하였다.
class FuncHook(gdb.Breakpoint):
def __init__(self, addr):
super().__init__(f"*{addr:#x}", gdb.BP_BREAKPOINT, internal=False)
self.addr = addr
def stop(self):
global idx
# print(f"Func Hook: {self.addr:#x}, idx: {idx}")
idx += 1
return False
class UpdateHook(gdb.Breakpoint):
def __init__(self, addr):
super().__init__(f"*{addr:#x}", gdb.BP_BREAKPOINT, internal=True)
self.addr = addr
def stop(self):
global bruteforce, idx, char_indices
char_indices[idx] = (char_indices[idx] + 1) % len(printable_chars)
bruteforce[idx] = ord(printable_chars[char_indices[idx]])
marker[idx] = False
return False