(Trend Micro CTF 2017) Analysis-offensive
100점 짜리라고 꼭 쉬우리라는 법은 없다.
오히려 200점이 더 쉬운듯. 안풀리면 그냥 넘어가고 끝날 때 쯤 주어지는 힌트를 노려야 한다.
100
Forensic_Encyption 까지는 얻었고 MZ string이 있길래 exe인가 싶어 확장자 변경하고 실행해봤더니 검은창 뜨다가 그냥 꺼진다. PEiD에 올려도 안나오고, Ollydbg에 올라가지도 않는 걸로 봐서 실행 파일은 아닌 것 같다. 이대로 파일 자체를 decryption해야 하는걸까?
파일의 맨 끝에 file_3PK / file_1PK / file_2PK라는 stirng이 있는데 이걸로 보아하니 압축파일 형식인 것 같다. 파일 자체를 encryption 했으면 맨 끝에 저런 string이 없겠지. 그니까 자체를 decryption하는건 아니다. .zip으로 바꾸고 압축 열어보면 열리기는 하는데, 압축이 풀리지는 않음. File Signature가 MZ인 압축파일 형식이 있나???
File Signature를 PK로 바꾸고 압축 해제하면 풀린다고 함.
풀면 파일 3개가 나온다
file1
Signature를 보면 FF D8 FF E0
JPEG파일로 중간 쯤에 있는 문자열 스트링을 base64 decode하면 Turing\_Machine_automaton
이라는 문자열이 나온다.
file2
Signature는 50 4B 03 04
(PK) .zip파일로 확장자 변경하고 압축 해제하려하면 비밀번호를 입력하라고 함. Turing\_Machine_automaton
입력하면 key.txt가 떨어지고, 두 아이피 간 IPsec의 SA ( Security Association )가 나온다.
file3
Signature는 0A 0D 0D 0A
이고, .pcapng 파일이라고 한다. 와이어샤크로 열어야함. 중간에 ESP 통신하는게 있는데 이를 file2에서 얻은 SA 정보를 입력해 복호화할 수 있다.
복호화 하면 M4 Navy Reflector:C Thin, beta, I, IV, II (T M J F), Plugboard: L-X/A-C/B-Y TMCTF{APZTQQHYCKDLQZRG} 가 나오는데 enigma로 encryption되어있다. 위에 나온 정보를 바탕으로 decryption하면 RISINGSUNANDMOON 이 나온다. * T M J F는 Ground setting에 입력해야 한다. Ring setting은 A A A A 그대로 두면 된다.
200 - solve
리버싱해보면 flag는 다음과 같은 조건을 만족하는 수다.
- 6자리 숫자일 것.
- 2자리 중 맨 마지막 두 자리 값은 1+3+5… + (2n+1) 일 것.
1
2
3
4
5
6
7
var result = 0;
for(var i = 1; result < 100; i += 2){
result += i;
console.log(result);
}
======
01, 04, 09, 16, 25, 36, 49, 64, 81
중간 중간 호출되는 401000함수?
40300D와 403009의 값이 같거나 40300D를 403009로 나눈 나머지가 0이어야 한다. 403009는 2부터 1씩 증가. 40300D는 중간 두자리의 StrToIntA()
의 결과.
그래서 중간 두 자리가 01이면 2부터 시작하는 403009와 값이 같을 수 없으며 나머지가 0이 나올 수도 없어 무한루프에 빠진다.
(앞 네자리의 StrToIntA 결과) XOR
(뒤 두자리의 StrToIntA 결과의 제곱값) 그 다음 연산 결과를 8bit right shit ( SHR EAX, 8
) 하고 Z flag
를 확인한다. 따라서 XOR
연산 결과 값이 1 byte ( 2 hex ) 를 넘어가면 안된다. 이는 하위 1 byte를 제외하고는 같은 값을 가져야 한다는 것을 의미한다.
- 앞 네자리는 뒤 두자리의 제곱값과 하위 1 byte를 제외하고는 같은 값을 가지는 범위 내에 있는 값 일 것.
마지막 검사루틴은 각 자리의 byte 값을 모두 더한 값에 0x120을 빼고 이 결과를 40300D에 넣고 401000를 호출하는데 여기서 반드시 40300D와 403009의 값이 같은 조건으로 통과해야한다.
즉, 연산 결과가 소수여야 한다.
근데, 여기서 뿐만이 아니라 이전에 401000을 호출했을 때 모두 소수였어야 한다 . 그래야 403005가 0x80000000이 되지 않아 종료되지 않고 통과할 수 있다.
소수이려면 짝수로 끝나는건 다 제외하고 401000 호출 시점을 따져보면
- 6자리 전체가 소수이면서 앞의 두 자리, 중간 두 자리가 소수인 수 일 것.
04는 어차피 제곱해도 high 2byte가 00이라 안된다.
그렇게 해서 찾은게 231349 234149 234749 235349 235849 236549 236749 238949 요렇게 되는데 답은 236749였다.
300
.apk를 실행할 수 있는 환경이 아니라…