Twist1.exe is run in x86 windows.
- ExeinfoPe
- 010 Editor
- IDA 7.0
- ExeinfoPe로
Twist1.exe
를 분석해보았다. - IDA 7.0 및 기타 디버거에서 디버깅을 시도했으나 실패했다.
- 이를 우회하기 위해 프로세스 덤프 파일에서 PE 파일을 추출한다.
-
Twist1.exe
를 실행한 뒤 해당 프로세스의 덤프 파일을 생성한다.
-
Twist1.DMP
를 010 Editor로 열어서 분석해보았다.- Module 중 원하는 PE 파일의
BaseOfImage
와SizeOfImage
를 알아낸다.
-
Twist1.DMP
의RawData
섹션 중 PE 파일 부분을BaseOfImage
와SizeOfImage
에 기반하여 선택한 후 복사한다.
-
- 복사한 값들을 새로운 파일인
Twist1.DMP.extracted.exe
에 저장한다.
- 복사한 값들을 새로운 파일인
-
- 프로세스 덤프 파일에서 추출한 PE 파일을 분석하여 플래그를 얻는다.
-
check_input
함수의 결과값이0
이 아니어야Correct!
문자열이 출력되는 루틴으로 빠진다.
-
check_input
함수를 분석해보았다.input[6] xor 0x36
의 결과값이0x36
일 때 정상 루틴으로 진행된다.input[6] = 0x00 (null byte)
, 즉 플래그는 6글자임을 알 수 있다.
-
input[0] ror 0x6
의 결과값이0x49
일 때 정상 루틴으로 진행된다.input[0] = 0x52 ('R')
임을 알 수 있다.
-
input[2] xor 0x77
의 결과값이0x35
일 때 정상 루틴으로 진행된다.input[2] = 0x42 ('B')
임을 알 수 있다.
-
input[1] xor 0x20
의 결과값이0x69
일 때 정상 루틴으로 진행된다.input[1] = 0x49 ('I')
임을 알 수 있다.
-
input[0] xor 0x10
의 결과값이0x43
이 아니어야 정상 루틴으로 진행된다. 이미input[0] = 0x52 ('R')
임을 알기 때문에 쉽게 알 수 있다.input[3] xor 0x21
의 결과값이0x64
일 때 정상 루틴으로 진행된다.input[3] = 0x45 ('E')
임을 알 수 있다.
-
input[4] xor 0x46
의 결과값이0x8
일 때 정상 루틴으로 진행된다.input[4] = 0x4e ('N')
임을 알 수 있다.
-
- 중간의 코드 자가 변조 부분을 직접 패치하고 디스어셈블했다.
input[5] rol 0x4
의 결과값이0x14
일 때 정상 루틴으로 진행된다.input[5] = 0x41 ('A')
임을 알 수 있다.
-
- Wikipedia - Ribena
Twist1
이름 그대로 꼬일 대로 꼬인 문제다.- 패킹 및 각종 안티 디버깅 기법들, 코드 자가 변조까지 리버서를 괴롭히기 정말 좋은 문제다.
- 내 방식은 꼼수의 꼼수를 부려 푼 것이다. 깔끔하게 풀 수 있는 방법을 찾아봐야겠다.