1. 파일 준비
$ unzip prob.zip # 바이너리 꺼냄
$ chmod +x prob # 실행 권한
2. 문자열로 구조 미리 파악
$ strings prob | grep -A1 -B1 flag
Enter flag:
Incorrect input length.
Wrong flag.
Correct! Flag accepted.
- 플로우: 길이 확인 → 내용 비교 → 성공/실패.
3. 코드 핵심 확인 (objdump)
$ objdump -d -M intel -j .text prob > dis.txt
dis.txt
요약:
구간 | 동작 |
---|---|
fread(buf, 0x49) |
73바이트 입력 |
루프 | 0 ~ 72 인덱스를 검사 |
짝수 인덱스 | (byte XOR 0x37) + i == arr1[i] |
홀수 인덱스 | (byte + i) XOR 0xAB == arr1[i] |
→ arr1이라는 73바이트 테이블이 정답.
4. arr1 테이블 추출
.data
시작 오프셋 확인:
$ readelf -S prob | grep .data
[15] .data PROGBITS 0000000000003020 ...
- 73바이트 덤프:
$ dd if=prob bs=1 skip=$((0x3020)) count=0x49 2>/dev/null | xxd -p
7cdd58c462d2542909920fda1be91094...
5. 역연산 공식
인덱스 | 프로그램 연산 | 역연산 |
---|---|---|
짝수 | (flag ^ 0x37) + i |
(enc - i) ^ 0x37 |
홀수 | (flag + i) ^ 0xAB |
(enc ^ 0xAB) - i |
(모두 1 바이트라서 & 0xFF
필요)
6. Python 스크립트로 복원
arr = bytes.fromhex(
"7cdd58c462d2542909920fda1be91094"
"15dc15ef16ec69e76be228d421fe2c29"
"57cf5303b83f4833e853235c78bc08cd"
"b3dc03dc443c496d995d849029706902"
"970692"
)
flag = []
for i, v in enumerate(arr):
if i & 1: # 홀수
flag.append(((v ^ 0xAB) - i) & 0xFF)
else: # 짝수
flag.append(((v - i) & 0xFF) ^ 0x37)
print(bytes(flag).decode())
출력:
Kuality{602f85502f4152d5d09c9da751971ee33cb0dddf67b4c7406220a1d02dff}
7. 실행 검증
$ ./prob
Enter flag:
Kuality{602f85502f4152d5d09c9da751971ee33cb0dddf67b4c7406220a1d02dff}
Correct! Flag accepted.
8. 결론
- 테이블 + 단순 XOR/덧셈 구조였으므로 역산이 가능했다.
- 추출한 테이블을 바이트별로 되돌려 얻은 플래그가 프로그램에서도 유효함을 확인했다.
위 절차를 통해 문제를 정상적으로 해결했음을 증명한다.