[Tutorial] rev_basic_2

@yd1ng· May 12, 2025 · 2 min read


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 테이블 추출

  1. .data 시작 오프셋 확인:
$ readelf -S prob | grep .data
[15] .data PROGBITS 0000000000003020 ...
  1. 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/덧셈 구조였으므로 역산이 가능했다.
  • 추출한 테이블을 바이트별로 되돌려 얻은 플래그가 프로그램에서도 유효함을 확인했다.

위 절차를 통해 문제를 정상적으로 해결했음을 증명한다.

@yd1ng
안녕하세요. 양진영입니다.
© copyright 2025. yd1ng all rights reserved.