ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 4팀 박윤진 write-ups (ctf-d_아나그램(Anagram)할 사람?)
    2021/Write-Ups 2021. 11. 9. 20:06

    엑셀 파일로 주어진다.

    파일을 열면 안전하지 않을 수 있다고 뜬다. (일반적으로 이런 파일은 열면 안된다)

    파일의 형식과 확장자 명이 일치하지 않다고 경고하는데, HxD로 열어보면 다른 xlsx파일과 헤더 푸터는 동일하다.

    경고창을 무시하고 예. 를 열면

     

    열은 W, 행은 14747까지 숫자로 꽉 채워져있다.

     

    애너그램(Anagram): 특정 단어나 문장을 재배열해 다른 문장이나 단어로 읽히게끔 하는 것 (언어유희)

    ex) FRIED = FIRED / GAINLY = LAYING / SADDER = DREADS / LISTEN = SILENT

    해리포터에서도 사용됨

    개념을 알더라도 풀이 방법을 잘 모르겠다.

     

    다시 생각해보면, 여기서 주목해야할 점은

    인터넷에서 가져온 파일이기때문에 "제한된 보기" 경고창과, 편집 사용을 누르면 "보안 경고" 경고창이 뜬다.

    "보안 경고" 경고창을 읽어보면, 매크로를 사용할 수 없도록 설정했다고 한다.

    따라서 이 엑셀 파일은 문서가 단순히 애너그램 문제 파일이 아니라, 매크로가 포함된 파일임을 알 수 있다.

    따라서 어떤 매크로가 포함됐는지 확인하기 위해, [보기] 탭 - [매크로] - [매크로 보기] 메뉴를 선택한다.

    아니나다를까, DoIt 매크로가 포함되어있다.

    위 코드는 VBA(Visual Basic for Application)으로, 마이크로소프트 오피스에 기본적으로 탑재되는, 사용자가 직접 소프트웨어 기능을 정의하거나 확장할 수 있도록 하는 범용 프로그래밍 언어이다.

     

    [간단 VBA 문법]

    변수

    [키워드] 변수명 [As 데이터형]

    ① 키워드: Dim Static Private Public

    명칭 키워드 변수 사용 범위 설명
    지역 변수 Dim 프로시저(Procedure) 수준 - 선언된 프로시저에서만 사용 가능
    - 실행할 때마다 재생성되므로 초기값이 0, 공백, Null이 됨
    모듈 변수 Dim 또는 Private 모듈(Module) 수준 - 선언한 모듈에서만 사용 가능
    - 프로그램이 종료될 떄까지 값 유지
    전역 변수 Public 프로젝트(Project) 수준 - 프로젝트의 어디서나 사용 가능
    - 프로그램이 종료될 때까지 값 유지
    - 모듈 개체에서만 선언 가능 (폼이나 시트 개체에서는 선언해도 의미가 없음)
    정적 변수 Static 프로시저(Procedure) 수준 - 선언된 프로시저에서만 유효
    - 지역 변수지만, 프로그램이 종료될 때까지 값 유지

    ② 변수명

    ③ As 데이터형

    생략 가능, default는 Variant로, 데이터형에 상관없이 대부분의 자료를 기억할 수 있게 됨 (큰 메모리 차지)

    Range(셀 변수), Date(일자 변수), User-defined(Type문을 사용해서 만든 사용자 정의 형식)

    Byte, Integer, Long, Single, Double, Currency, String, Variant, Boolean, Object, 

     

    & 을 사용하면 자동으로 숫자를 string으로 바꿔서 더해줌

     

    비교연산자

    같지 않다: != 가 아닌 <>를 사용

    A To B 사용 가능

     

    조건문

    if (조건1) then

        명령문1

    ElseIf (조건2) Then

        명령문2

    Else

        명령문3

    End if

     

     

    반복문

    Do While(조건)

        명령문

    Loop

     

    For i = 0 To 10

        명령문

    Next i

     

    스위치문

    Select Case 식(변수)

    Case 값1

        처리할 내용

    Case 값2

        처리할 내용

    Case Else

        처리할 내용

    End Case

     

    엑셀에 보이는 코딩

    Sub T()

        Cells(1, 1).Value = 4

        Cells(1, 1).Interior.ColorIndex = 3

    End Sub

     

    코드의 묶음: 프로시져

    1) Sub 프로시져

    Sub 프로시져이름()

        프로시져 내용

    End Sub

     

    Call 프로시져이름()

     

    2) Function 프로시저 = 함수

    매개변수로 바깥에서 값을 받아오는 것 뿐만 아니라 반환을 통해 바깥으로 값을 보내준다

    Function 함수이름(매개변수)

        명령문

    End Function

     

    주석 ' (작은 따옴표)

     

    ' 인자로 들어온 파일명이 있는지 확인하고 반환
    Function FileExists(ByVal FileToTest As String) As Boolean
       FileExists = (Dir(FileToTest) <> "")
    End Function
    
    ' 인자로 들어온 파일을 삭제
    Sub DeleteFile(ByVal FileToDelete As String)
       If FileExists(FileToDelete) Then 'See above
          SetAttr FileToDelete, vbNormal
          Kill FileToDelete
       End If
    End Sub
    
    ' 메인 프로시저 선언
    Sub DoIt()
    	' C:\User\[유저명] 아래에 있는 fileXYZ.data가 있다면 삭제한다
        Dim filename As String
        filename = Environ("USERPROFILE") & "\fileXYZ.data"
        DeleteFile (filename)
        
        ' https://m.cafe.daum.net/ilovevb/4YrA/49
        ' 이진 모드로 파일을 연다. 파일포인터는 #2
        Open filename For Binary Lock Read Write As #2
        
        ' 셀 전체를 순회하면서, #2 파일에, Byte로 변환한 (Cell-78)/3 값을 작성한다.
        For i = 1 To 14747
            For j = 1 To 23
                Put #2, , CByte((Cells(i, j).Value - 78) / 3)
            Next
        Next
        
        ' 그리고 아래 Byte값을 작성한다.
        Put #2, , CByte(98)
        Put #2, , CByte(13)
        Put #2, , CByte(0)
        Put #2, , CByte(73)
        Put #2, , CByte(19)
        Put #2, , CByte(0)
        Put #2, , CByte(94)
        Put #2, , CByte(188)
        Put #2, , CByte(0)
        Put #2, , CByte(0)
        Put #2, , CByte(0)
        
        Close #2
    End Sub

     

    수동으로 할 필요 없이, C:\User\[유저명] 아래에 있는 fileXYZ.data 파일 데이터가 중심이므로,

    매크로를 실행시킨 뒤 해당 파일을 열어본다.

    리눅스 실행파일인 ELF 파일 형태임을 알 수 있고,

     

    HxD에서도 조금 확인할 수 있고, 단 이것은 불완전한 값이므로 Linux 환경에 옮겨서 실행해야 한다.

    SharifCTF{5bd74def27ce149fe1b63f2aa92331ab}