루틴 분석
_start 의 마지막 루틴 부분에 보면, __return_addr, var_4, var_8_2 를 인자로 하여 sub_401000 함수를 호출한다.
sub_401000
sub_401000 함수는 크게 4가지로 나눌 수 있다.
Input Name이라는 문자열을 출력하며, 이름을 입력 받는다.
그 후 이름을 이용하여, 어떠한 문자열들을 생성한다.
그리고 Input Serial: 라는 문자열을 출력하고, 시리얼을 입력 받는다.
마지막으로는 이름을 기반으로 생성한 문자열과 시리얼을 비교하고, 이에 대한 결과를 출력한다.
따라서 2번째 과정인 이름을 기반으로 시리얼을 생성하는 과정을 분석해 본다.
시리얼 생성
생성 루틴의 처음을 보면, esi 와 0x3 을 비교한 후 작을 경우에 xor을 생략한다.
처음 루틴에 들어왔을 경우에는 esi 가 0으로 초기화되었기 때문에, xor 루틴을 생략된다. 그리고 esi 는 0 이기에 esp+0xc 를 ecx에 넣는다.
여기서 esp+0xc 에는 0x10이 들어가 있다. 이 값은 esi 의 증가에 따라서 0x10, 0x20, 0x30 으로 변화할 것이다.
그 다음으로는 esp+ebp+0x10의 바이트를 edx에 넣는다. 마찬가지로 ebp 는 0으로 초기화 되어있기에 esp+0x10 의 바이트가 들어갈 것이고, esp+0x10에는 입력받은 문자열의 시작 주소를 가리키고 있다.
따라서 ebp 가 증가함에 따라 edx 에는 입력받은 문자열에서 순서대로 하나씩 문자가 들어갈 것이다.
분석한 생성 과정을 바탕으로, 이름에서 시리얼을 생성하는 파이썬 코드는 위와 같다.
이름 복구
생성 방식이 단순히 xor 만을 이용하기에, 시리얼에서 이름을 구하는 코드도 비슷하다.
시리얼을 문자열 형태로 받고, 이를 이용하여 이름을 복구(?!)한다.
이를 이용하여 이름을 구하면 "K3yg3nm3" 라는 이름으로 나온다.
확인 결과 이름과 시리얼이 일치하는 것을 확인할 수 있다.
'0x00 Reversing > 0x01 Reversing.kr' 카테고리의 다른 글
Reversing.kr :: Ransomware (0) | 2019.12.09 |
---|---|
Reversing.kr :: Easy_ELF (0) | 2019.10.05 |
Reversing.kr :: Easy_Unpack (0) | 2019.03.01 |
Reversing.kr :: Easy_Crack (0) | 2019.02.24 |