[DH] honest

Writeup
2025. 8. 15.

Introduction

honest 문제에 대한 writeup입니다.

분석

ida로 뜯어보면 calcuate 후 나온 값을 비교하고 다음 verify 함수로 넘어가는 구조가 반복된다. 따라서 calculate를 리버싱하고 각 함수들에 맞게 찾아줘도 되지만, 어차피 64비트 각 바이트에 대해서 반복연산을 하는거라 O(64)O(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

[DH] honest