-
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}
'2021 > Write-Ups' 카테고리의 다른 글
4팀_김세연 write-ups (ctf-d_우리의 제일 귀여운...) (0) 2021.11.09 3팀 이수현 Write-Ups(ctf-d_저희는 이 문서를 찾았습니다) (0) 2021.11.09 4팀 임예은 Write-Ups(Suninatas_02) (0) 2021.11.09 3팀_김기연 write-ups (HackCTF_So easy?) (0) 2021.11.09 3팀 이은경 Write-Ups (ctf-d_저는 플래그를 이 파일에..) (0) 2021.11.09