7주차 - 리버싱 보고서

Bae YuSeon·2022년 11월 16일
0

E-COPS

목록 보기
8/9
post-thumbnail

정규세션 복습

  • 리버싱이란?
    리버스 엔지니어링, 즉 리버싱이란 소스를 역추적하는 것을 말한다.
    물건이나 기계장치 혹은 시스템 등의 구조, 기능, 동작, 등을 분석하여 그 원리를 이해하고 이를 통해 단점을 보완하고 새로운 아이디어를 추가할 수 있다.

  • 리벙싱 분석 방법
    1) 정적분석 : 파일을 실행시키지 않고 내부 코드와 구조를 확인하는 방법
    2) 동적분석 : 파일을 직접 실행해 파일, 레지스트리, 네트워크 등을 관찰하여 프로그램의 행위를 분석하는 방법

Suninatas reversing

  • 9번
    문제 파일을 다운 받고 실행할 때 window defender가 실행파일을 위협으로 판단해 실행하는 데 어려움을 겪었다. 보안 설정에 들어가서 이 파일에 대한 설정을 바꿔주면 실행을 할 수 있다.
    사용자로부터 입력을 받은 뒤, 그 값을 검사하는 방식으로 작동된다. 틀린 값을 입력하고 Click!버튼을 누르면 입력값이 사라진다.
    x32dbg를 사용해 코드를 추측할 수 있다.

    문자열 참조를 통해 문자열을 보다 어딘가에 있을 성공 문자열 congratulation이라는 단어를 검색해서 분석할 부분을 찾을 수 있었다.
    성공 문자열 위에 jne(ZF=0 이면 jump)명령이 있다. jump를 하지 않아야 congratulation이 출력되므로 ZF=1로 세팅되어야 한다.
    <projecr1.sub_40468>함수의 인자 eax([ebp-4])는 사용자의 입력값을 갖고, edx는 913465라는 값을 인자로 갖는다. cmp eax, edx에서 두 값이 같아야 ZF=1로 세팅되므로 사용자의 입력이 913465가 되어야 한다.

  • 11번

    9번과 작동방식은 비슷하다. 사용자로부터 입력을 받은 뒤, 그 값을 검사한다. 틀린 값을 입력하면 입력값이 사라진다.
    마찬가지로 x32dbg를 사용해 코드를 추측할 수 있다.
    9번과 같은 방식으로 congratulation이라는 단어를 검색해서 분석할 부분을 찾을 수 있었다.
    마찬가지로 성공 문자열 위에 jne(ZF=0 이면 jump)명령이 있다. jump를 하지 않아야 congratulation이 출력되므로 ZF=1로 세팅되어야 한다. 그러기 위해서 00450355주소에서 호출되는 함수의 반환값이 0이어야 한다. 004502C0부터 0045032E까지 보면 [ebx+310]은 "2V", [ebx+318]은 "B6", [ebx+31C]는 "H1", [ebx+314]는 "XS", [ebx+320]은 "0F"의 값을 갖는 순서로 배열되고, [ebx+330]주소로 그 문자열에 접근할 수 있다는 것을 알 수 있다. 이후에 00450355 주소에서 호출되는 함수의 인자로 [ebp-4], [ebx+330]의 값이 들어가는데, [ebp-4]에는 사용자의 입력값이, [ebx+330]에는 "2VB6H1XS0F"라는 값이 들어있다. cmp eax, edx에서 두 값이 같아야 ZF=1로 세팅되므로 사용자의 입력이 2VB6H1XS0F가 되어야 한다.

드림핵 rev-basic-1

rev-basic-1 rev-basic-1
문제 파일을 다운받고 실행하면 파일은 사용자에게 문자열을 입력 받아 입력값을 검증한 후 correct 또는 wrong 출력하는 방식으로 작동한다.
IDA에서 파일을 열어 정적 분석을 해 준다.

디컴파일(F5)을 통해 메인 함수에서 참조하는 것을 확인할 수 있다.
sub_14000100 함수를 분석하기 위헤 더블클릭을 하면

_BOOL8 __fastcall sub_140001000(_BYTE *a1)
{
  if ( *a1 != 67 )
    return 0i64;
  if ( a1[1] != 111 )
    return 0i64;
  if ( a1[2] != 109 )
    return 0i64;
  if ( a1[3] != 112 )
    return 0i64;
  if ( a1[4] != 97 )
    return 0i64;
  if ( a1[5] != 114 )
    return 0i64;
  if ( a1[6] != 51 )
    return 0i64;
  if ( a1[7] != 95 )
    return 0i64;
  if ( a1[8] != 116 )
    return 0i64;
  if ( a1[9] != 104 )
    return 0i64;
  if ( a1[10] != 101 )
    return 0i64;
  if ( a1[11] != 95 )
    return 0i64;
  if ( a1[12] != 99 )
    return 0i64;
  if ( a1[13] != 104 )
    return 0i64;
  if ( a1[14] != 52 )
    return 0i64;
  if ( a1[15] != 114 )
    return 0i64;
  if ( a1[16] != 97 )
    return 0i64;
  if ( a1[17] != 99 )
    return 0i64;
  if ( a1[18] != 116 )
    return 0i64;
  if ( a1[19] != 51 )
    return 0i64;
  if ( a1[20] == 114 )
    return a1[21] == 0;
  return 0i64;
}

이러한 코드가 나온다.
모든 아스키코드 값을 변환해주면 Cmpar3_the_ch4ract3r 이라는 문자열을 얻을 수 있다. 따라서 flag는 DH{Compar3_the_ch4ract3r}이다.

0개의 댓글

관련 채용 정보