본문 바로가기

Reversing/Dreamhack : Reverse Engineering

[Dreamhack] rev-basic-2

Reversing Basic Challenge #2

이 문제는 사용자에게 문자열 입력을 받아 정해진 방법으로 입력값을 검증하여 correct 또는 wrong을 출력하는 프로그램이 주어집니다.

해당 바이너리를 분석하여 correct를 출력하는 입력값을 찾으세요!

획득한 입력값은 DH{} 포맷에 넣어서 인증해주세요.

예시) 입력 값이 Apple_Banana일 경우 flag는 DH{Apple_Banana}

 

main 함수 분석

  • sub_140011B0 → prinf 함수
  • sub_14001210 → scanf 함수

 

sub_140001000 → 입력값 검증함수

  • 인자로 전달된 값 → a1
  • 반복문을 0x12 = 18번 반복함
  • if문의 조건이 성립하면 0을 반환, 성립하지 않고 18번 반복하면 1을 반환함
  • 1이 반환되도록 하려면 *(unsigned __int8 *)(a1 + i)*(_DWORD *)&aC[4 * i]의 값이 동일해야함
  • *(_DWORD *)&aC[4 * i] → 주소가 4씩 증가함을 볼 수 있음.

*(_DWORD *)&aC[4 * i]

 

1. aC[ 4*i ]

  • aC는 배열 또는 포인터, 4*i는 인덱스
  • ac배열에서 ( 4*i )번째 요소

2. &aC[4 * i]

  • &aC[4 * i]의 주소를 가져옴

3. (_DWORD *)&aC[4 * i]

 

  • &aC[4 * i]의 주소를 _DWORD * 형식으로 캐스팅함
  • _DWORD → 4바이트 크기의 unsigned int

4. *(_DWORD *)&aC[4 * i]

  • aC의 4 * i 위치에서 4바이트(32비트) 크기의 값을 읽음.

 

*(unsigned __int8 *)(a1 + i)

  • a1 + i 는 문자열 a1의 i번째 문자 위치

  • (a1 + i)를 unsigned__int8 즉 unsiged char *로 변환함
  • unsigned __int8은 보통 1바이트(8비트) 크기를 가진다.
  • a1[i] 값을 1바이트(unsigned char)로 가져옴.

 

결론

  • Scanf로 입력된 문자열이 aC부터 4바이트 단위로 18번 읽은 문자열과 동일해야함.



'Reversing > Dreamhack : Reverse Engineering' 카테고리의 다른 글

[Dreamhack] rev-basic-4  (0) 2025.04.21
[Dreamhack] rev-basic-3  (0) 2025.04.21
[Dreamhack] rev-basic-1  (0) 2025.04.21
[Dreamhack] rev-basic-0  (0) 2025.04.21
[Dreamhack] patch  (0) 2025.04.21