사례 연구*2023 년

깃발 찾기
바이너리.

사용 REA 작은 플래그 검사기를 검사하려면 규칙을 방정식으로 바꾸고 원래 프로그램을 인쇄하는 입력을 찾으십시오 Correct!.

크 사각형 국기 검사기·조명·Linuxx86-64

원래 도전 보기

바이너리에서 체크된 답으로

  1. 01*수표 찾기문자열에 대한 자세한 내용은 문자열에 대한 정보를 참조하십시오.REA 프롬프트,해당 참조 및 입력을 수락하거나 거부하는 코드를 찾습니다.
  2. 02*규칙 추출36 자*26 합계REA 각 검사 뒤에 있는 지침과 데이터를 반환합니다. 에이전트는 그것들을 방정식으로 바꿉니다.
  3. 03*해결 및 실행복구 된 플래그가 올바른지 확인하십시오!파이썬 스크립트는 방정식을 해결합니다. REA 결과를 받아들이는 원래 프로그램을 캡처합니다.
이 도전은 조셉의 작품으로,다운더크의 공식 저장소에 출판되었습니다.

검사 코드 찾기

유인물은 15 킬로바이트 실행 파일입니다. 그것은 깃발을 요구 한 다음 인쇄합니다 Correct! 또는 Incorrect!. 에이전트에 대한 간단한 요청으로 시작하십시오.

코딩 에이전트

사용 REA 그리고 플래그를 찾을 수 있습니다. 검사가 어떻게 작동하는지 설명 한 다음 원래 프로그램으로 답을 확인하십시오.

다운로드 한 도전을 로컬에서 사용할 수 있고 기계 코드 프로그램 분석 제공자가 연결된 예제 프롬프트.

  1. 입력 프롬프트를 따라 해당 기능을 수행합니다

    에이전트→REA
    open_binary
    {"path": "ms_flag_checker"}
    
    search_strings
    {"pattern": "flag|correct|wrong|input",
     "mode": "regex", "case_sensitive": false}
    
    xrefs
    {"address": "0x102004"}
    
    resolve_containing_procedure
    {"address": "0x10126d"}
    REA→에이전트·선택한 결과
    0x102004  "What is the flag? "
    0x10201c  "Incorrect!"
    0x102027  "Correct!"
    
    Prompt referenced at: 0x10126d
    Containing function: 0x10124d

    이 참조는 실행 파일의 원래 함수 이름이 제거되었음에도 불구하고 에이전트에게 조사할 장소를 제공합니다.

  2. 검사기 및 두 도우미 읽기

    에이전트→REA
    analyze_function
    {"procedure": "0x10124d"}
    
    analyze_function
    {"procedure": "0x101189"}
    
    analyze_function
    {"procedure": "0x101217"}
    REA→에이전트·선택 지침
    0x1012c1: CMP EDI, 0x24
    0x1012c6: LEA RBX, [0x1040e0]
    0x1012cd: LEA RBP, [0x104060]
    0x1012d4: LEA R13, [RBX + 0x270]
    0x1012e1: CALL 0x00101189
    0x1012ec: CALL 0x00101217
    0x1012f1: CMP dword ptr [RBP], EAX
    0x1012f4: JNZ 0x00101335
    0x1012f6: ADD RBX, 0x18

    첫 번째 루프는 36 자 코드를 복사합니다. 검사 루프는 마스크를 해독하고 선택한 코드를 합산하고 결과를 저장된 번호와 비교합니다. 그것의 0x18-바이트 단계 0x270 바이트는 26 개의 마스크를 제공합니다.

이들은 신선한 결과에서 선택된 결과입니다. REA 분석. 로컬 대상 경로는 표시를 위해 단축됩니다.주소는 다음을 참조합니다. REA가져온 이미지입니다.

한 번 확인하면 한 명의 캐릭터가 나타납니다.

검사기는 6 개의 6 개의 격자로 입력을 배열합니다. 마스크는 어떤 세포가 합에 기여하는지 선택합니다. 그 콤팩트한 인코딩은 음수를 사용하여 셀을 건너뛰고 양수를 사용하여 선택합니다.

일곱 번째 마스크는 21 개의 셀을 건너 뛰고 위치 21 을 선택한 다음 14 를 건너 뜁니다. 그 셀만이 합에 기여합니다. 필요한 문자 코드는 55 입니다.즉,문자는 7 입니다.
일곱 번째 검사는 하나의 위치를 선택합니다. 열린 그림.

바이너리에서 마스크 및 대상 읽기

에이전트→REA·read_bytes
{"address": "0x1040e0", "length": 624}
{"address": "0x104060", "length": 144}
REA→agent·일곱 번째 항목
Mask at 0x104170:
eb 01 f2 00  →  -21, +1, -14, stop

Target at 0x104078:
37 00 00 00  →  55

지시 MOVSX 마스크 바이트를 부호있는 값으로 읽습니다. 이것이 바로 eb -21 을 의미합니다. 목표는 작은 엔디안 정수입니다. 이 바이트는 에이전트에게 code[21] = 55,그래서 그 캐릭터는 7.

지시 사항부터 읽을 수 있는 검사까지

합산 도우미와 해당 호출 함수를 동일한 규칙에 연결하는 단계를 선택합니다.

REA·선택한 원래의 지침
0x10121c: MOV ECX, 0x0

0x10122c: CMP dword ptr [RSI + RAX*0x1], 0x0
0x101230: JZ 0x00101223

0x101232: ADD ECX, dword ptr [RDI + RAX*0x1]

0x101223: ADD RAX, 0x4

0x1012f1: CMP dword ptr [RBP], EAX
0x1012f4: JNZ 0x00101335
읽기 쉬운 씨*원 체크 요약
int check_one_mask(const int codes[36],
                   const int mask[36],
                   int target) {
    int total = 0;
    for (int i = 0; i < 36; ++i) {
        if (mask[i]) {
            total += codes[i];
        }
    }
    return total == target;
}

01*0 에서 시작합니다. ECX 실행 금액을 보유합니다.

지침은 합산 도우미 및 호출 함수에서 제공됩니다. 다 설명 요약 설명 이름과 평평한 36 셀 루프.

26 방정식 풀기

대부분의 마스크는 여러 셀을 선택합니다. 예를 들어,첫 번째 검사는 16 개의 문자 코드를 추가하고 총 1441 개가 필요합니다. 겹치는 선택은 작은 파이썬 스크립트가 함께 풀 수 있는 방정식을 제공합니다.

파이썬*솔버 발췌
from z3 import Int, Or, Solver, Sum, sat

codes = [Int(f"code_{i}") for i in range(36)]
solver = Solver()
alphabet = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789_{}"
for code in codes:
    solver.add(Or(*[code == ord(c) for c in alphabet]))
for code, char in zip(codes, "DUCTF{"):
    solver.add(code == ord(char))
solver.add(codes[-1] == ord("}"))

for selected, target in checks:
    solver.add(Sum([codes[i] for i in selected]) == target)

assert solver.check() == sat
model = solver.model()
print("".join(chr(model.eval(code).as_long()) for code in codes))

지 3 이 방정식을 만족시키는 값을 찾는 솔버입니다. 이 발췌문은 추출 된 검사를 사용하고 다음을 가정합니다 DUCTF{…} 문자,숫자,밑줄 및 중괄호가있는 플래그. 전체 다운로드에는 26 개의 마스크와 타겟이 모두 포함되어 있습니다.

전체 해결사 다운로드

원래 프로그램으로 답을 확인

REA'프로세스 캡처'는 해결된 플래그를 받아들이는 원래 실행 파일을 기록합니다. 에서 선택한 문자 하나를 변경 z 에 y 첫 번째 합계를 만든다 1440 대신 1441,프로그램은 그것을 거부.

입력 관찰된 산출 종료 코드
솔버의 깃발 Correct! 0
한 문자 변경 Incorrect! 255
복구된 플래그 및 캡처된 출력 표시
REA·원래 출력 프로그램
What is the flag? DUCTF{ezzzpzzz_07bcda7bfe81faf43caa}
Correct!

복구된 값은 또한 조직자의 게시된 챌린지 메타데이터의 플래그와 일치하며,바이너리를 해결한 후 확인됩니다.

출처,대상 신원 및 분석 세부 정보

신선한 분석 및 두 개의 프로세스를 캡처에서 8 월 2026 를 사용하여,REA4.1.0 와Ghidra12.1.4 에Linuxx64. 바이너리는 86-64 엘프,15,248 바이트입니다.

원 실행·SHA-256
dcd3bec4f608e11f3a12ce461100aaf5f621851ee63a1f870d7c90d4e3dd51ae

문자열 참조,함수 및 상수는 조직자의 소스 또는 솔루션을 읽기 전에 검사되었습니다. 파이썬 솔버와 다이어그램은 REA 결과.

주최자의 출처와 비교 · 챌린지 메타데이터 및 플래그 · REA 증거 노트

그것을 자신을 시도

하나의 폴더에 원래의 도전과 솔버를 다운로드합니다. 위의 프롬프트를 사용하여 에이전트와 함께 조사하거나 포함된 스크립트를 실행합니다.

터미널*해결 및 실행
python3 -m venv .venv
.venv/bin/python -m pip install z3-solver
.venv/bin/python solve.py

chmod +x ms_flag_checker
./ms_flag_checker

이 스크립트는 후보 플래그를 인쇄;프로그램의 프롬프트에 붙여 넣습니다. 해결은 파이썬과 z3-solver. 원래 실행 파일 실행 필요 Linux 86-64 번

설정 REA 코딩 에이전트와 함께

상단