advance 문제 다시풀어보기 전에 기초 다질겸 basic 20번 문제를 다시한번 풀어보았다.
메인 함수보면 CRACKME3.KEY 파일이 있는지 확인 후 있다면 파일 데이터가 0x12 byte 인지 확인한다.
같은 디렉토리에 따로 18byte CRACKME3.KEY 파일을 만든다음 분석을 진행했다.
함수 두개만 중점적으로 보면 된다.
첫번째 함수이다. 대략 pseudo code로 나타내보면
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 | int file_data[18]; int sum = 0; int bl = 0x41; for (int i = 0; ; i++) { file_data[i] ^= bl; bl++; sum += file_data[i]; if (file_data[i] == 0) break; if (bl == 0x4f) break; } sum ^= 0x12345678; if (file_data[15~18] == sum) Correct; else Incorrect; | cs |
이런 느낌이다. (물론 C언어로 컴파일하면 에러난다 ㅎ.. 대략 느낌만 나타낸 코드다)
저렇게 합한 sum 값과 0x12345678 을 xor 한 후 input_data[15~18] 값과 비교한다.
이 해당 값이 맞으면 correct 문이 나온다 :)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 | #include <stdio.h> int main() { int file_data[18] = { 67, 111, 100, 101, 69, 110, 103, 110, 33, }; // CodeEngn! int sum = 0; int bl = 0x41; for (int i = 0; ; i++) { file_data[i] ^= bl; printf("%x ", file_data[i]); //02 2D 27 21 00 28 20 26 68 4A 4B 4C 4D 4E bl++; if (bl == 0x4f) break; } return 0; } | cs |
암호화 한 후 나온 값이 "CodeEngn!" 이 나올 수 있게 CRACKME3.KEY 값을 바꿔 준 후 실행시켰다.
(어라.. 뒤에 ! 가 자동으로 붙네 ㅎㅎ..)
'Reversing > ▷ Study' 카테고리의 다른 글
angr 설치 (0) | 2018.01.03 |
---|---|
Retargetable Decompiler (0) | 2017.12.23 |
ELF Simple Anti Reverser (0) | 2017.06.22 |
프로그램 실행구조 (0) | 2017.03.15 |
어셈블리와 C언어의 포인터 구문 형식 (0) | 2017.03.08 |