검사 코드 찾기
유인물은 15 킬로바이트 실행 파일입니다. 그것은 깃발을 요구 한 다음 인쇄합니다 Correct! 또는 Incorrect!. 에이전트에 대한 간단한 요청으로 시작하십시오.
사용 REA 그리고 플래그를 찾을 수 있습니다. 검사가 어떻게 작동하는지 설명 한 다음 원래 프로그램으로 답을 확인하십시오.
다운로드 한 도전을 로컬에서 사용할 수 있고 기계 코드 프로그램 분석 제공자가 연결된 예제 프롬프트.
-
입력 프롬프트를 따라 해당 기능을 수행합니다
에이전트→REAopen_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이 참조는 실행 파일의 원래 함수 이름이 제거되었음에도 불구하고 에이전트에게 조사할 장소를 제공합니다.
-
검사기 및 두 도우미 읽기
에이전트→REAanalyze_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 개의 격자로 입력을 배열합니다. 마스크는 어떤 세포가 합에 기여하는지 선택합니다. 그 콤팩트한 인코딩은 음수를 사용하여 셀을 건너뛰고 양수를 사용하여 선택합니다.
바이너리에서 마스크 및 대상 읽기
{"address": "0x1040e0", "length": 624}
{"address": "0x104060", "length": 144}
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.
지시 사항부터 읽을 수 있는 검사까지
합산 도우미와 해당 호출 함수를 동일한 규칙에 연결하는 단계를 선택합니다.
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 실행 금액을 보유합니다.
02*마스크 셀을 확인합니다. 0 값은 문자를 건너뛰고 0 이 아닌 값은 문자를 포함합니다.
03*문자 코드를 추가합니다. 같은 오프셋에 있는 입력의 정수가 합에 더해집니다.
04*다음 셀로 이동합니다. 원래 루프는 정수당 4 바이트를 앞당기고 6 개의 셀의 6 개의 행을 방문합니다.
05*저장된 대상과 비교. 호출 함수는 EAX. 불일치가 Incorrect!.
지침은 합산 도우미 및 호출 함수에서 제공됩니다. 다 설명 요약 설명 이름과 평평한 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 |
복구된 플래그 및 캡처된 출력 표시
What is the flag? DUCTF{ezzzpzzz_07bcda7bfe81faf43caa}
Correct!
복구된 값은 또한 조직자의 게시된 챌린지 메타데이터의 플래그와 일치하며,바이너리를 해결한 후 확인됩니다.
출처,대상 신원 및 분석 세부 정보
신선한 분석 및 두 개의 프로세스를 캡처에서 8 월 2026 를 사용하여,REA4.1.0 와Ghidra12.1.4 에Linuxx64. 바이너리는 86-64 엘프,15,248 바이트입니다.
dcd3bec4f608e11f3a12ce461100aaf5f621851ee63a1f870d7c90d4e3dd51ae
문자열 참조,함수 및 상수는 조직자의 소스 또는 솔루션을 읽기 전에 검사되었습니다. 파이썬 솔버와 다이어그램은 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 번