• 티스토리 홈
  • 프로필사진
    satorare
  • 방명록
  • 공지사항
  • 태그
  • 블로그 관리
  • 글 작성
satorare
  • 프로필사진
    satorare
    • 분류 전체보기 (8)
      • book (0)
      • Translate (2)
      • bin (6)
      • wargame (0)
      • ctf (0)
  • 방문자 수
    • 전체:
    • 오늘:
    • 어제:
  • 최근 댓글
      등록된 댓글이 없습니다.
    • 최근 공지
      • ⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⋯
      등록된 공지가 없습니다.
    # Home
    # 공지사항
    #
    # 태그
    # 검색결과
    # 방명록
    • rev-basic-5
      2022년 10월 25일
      • satorare
      • 작성자
      • 2022.10.25.:15

       

      Ghidra로 디컴파일링한 main함수

      rev-basic-4와 유사한 형태의 main함수를 볼 수 있습니다.

       

      문자열 Wrong과 Correct의 출력을 결정짓는 부분은 라인 20의 조건문에 동반된 FUN_140001000 함수의 역할로 보입니다. 해당 함수를 살펴보겠습니다.

       

      함수 FUN_140001000의 내부

      FUN_140001000 함수의 내부에 반복문과 조건문이 존재합니다.

       

      while문은 총 0x17번 만큼 반복하며, 반복문 안의 조건문에 따라 리턴값이 달라집니다.

       

      조건식은 다음과 같습니다.

      param_1[local_18] + param_1[local_18 + 1] != DAT_140003000[local_18]

       

       

      >> param_1은 인수로 받아온 사용자 입력 문자열입니다. 

      >> local_18은 함수 FUN_140001000 내부 지역변수로 반복문의 제어변수 역할을 합니다. 

      >> DAT_140003000은 프로그램에 저장되어있는 배열입니다.

       

      해당 조건식을 만족하면 0을 리턴하고, 만족하지 못하면 1을 리턴합니다. 즉, 저희는 

      param_1[local_18] + param_1[local_18 + 1] == DAT_140003000[local_18]

      를 만족하는 문자열 키값 배열 param_1을 역연산 과정을 통해서 알아내면 될 것 같습니다.

       

      보다 간단히 이제부터 param_1을 P, DAT_140003000을 Q, local_18을 i라고 표현하겠습니다. 이를 토대로 정리하면

       

      P[i] + P[i + 1] = Q[i]

       

      직관적으로 보았을 때, 어떤 수 Q[i]는 P[i] - P[i-1]을 하면 알아낼 수 있습니다.

       

      예시를 들어보기 위해서 배열 P를 다음과 같이 정의하겠습니다

      P[] = {1, 2, 3, 4};

      이 때 제어변수 i를 4라고 한다면 위의 반복문은 다음과 같이 실행될 것입니다.

       

      P[0] + P[1] = 3 = Q[0]

      P[1] + P[2] = 5 = Q[1]

      P[2] + P[3] = 7 = Q[2]

      P[3] + P[4] = 4 = Q[3] 

       

      여기서 P[0], P[1], P[2] 들을 역산하고자 한다면 조금 힘들것입니다. Q[0]로 부터 P[0]를 역산하려했을때, Q[0] = 3이라는 결과만을 가지고서 그 합의 과정이 1+2 인지, 2+1 인지, 0+3 인지, 3+0 인지 알 수가 없기때문입니다.

       

      하지만 P[3]은 역산이 가능합니다. 바로 P[4]가 문자열의 끝을 표시하는 NULL문자로써, 0x00의 값을 보장하기 때문입니다. 이 점을 이용하여 우리는 Q[3]의 값을 알고있다면, NULL문자 P[4]와 결합하여 P[3]의 값을 유추해낼 수 있습니다. 그리고 이런식으로 문자열의 맨 끝부터 역산해나간다면, 모든 문자열을 파악해낼 수 있습니다.

       

      위의 Q 배열을 통한 P배열의 역산 과정을 정리하면 다음과 같을 것입니다.

       

      Q[3] = P[3] + P[4] ... 4 = P[3] + 0 ... P[3] = 4

      Q[2] = P[2] + P[3] ... 7 = P[2] + 4 ... P[2] = 3

      Q[1] = P[1] + P[2] ... 5 = P[1] + 3 ... P[1] = 2

      Q[0] = P[0] + P[1] ... 3 = P[0] + 2 ... P[0] = 1

       

      ∴ P[0..3] = {1, 2, 3, 4}

      임을 알 수 있습니다.

       

      이것을 토대로 역연산식을 만들어보면

      param_1[local_18] = DAT_140003000[local_18] - param_1[local_18 + 1]

      입니다.

       

      이제 DAT_140003000 배열의 값들을 살펴보겠습니다.

      배열 DAT_140003000

       

      더많은 값이 있지만, 반복문은 0x17번까지만 반복하기 때문에 총 23바이트까지만 보았습니다.

       

      이 값을 가지고 역산을 진행하여 키값을 구해보겠습니다.

       

      Replit으로 위와 같이 코드를 짜보았습니다.

       

      실행 결과, 다음과 같이 키값이 나오는걸 확인하였습니다.

      정답은 직접 입력해서 보시길 바랍니다.

       

      저작자표시 비영리 (새창열림)

      'bin' 카테고리의 다른 글

      4. 소유권 이해하기  (0) 2022.10.26
      rev-basic-4  (0) 2022.10.24
      러스트 프로그래밍 가이드 연습문제 1 ~ 3  (0) 2022.10.23
      3. 보편적인 프로그래밍 개념  (0) 2022.10.23
      rev-basic-3  (0) 2022.10.23
      다음글
      다음 글이 없습니다.
      이전글
      이전 글이 없습니다.
      댓글
    조회된 결과가 없습니다.
    스킨 업데이트 안내
    현재 이용하고 계신 스킨의 버전보다 더 높은 최신 버전이 감지 되었습니다. 최신버전 스킨 파일을 다운로드 받을 수 있는 페이지로 이동하시겠습니까?
    ("아니오" 를 선택할 시 30일 동안 최신 버전이 감지되어도 모달 창이 표시되지 않습니다.)
    목차
    표시할 목차가 없습니다.
      • 안녕하세요
      • 감사해요
      • 잘있어요

      티스토리툴바