728x90



시리얼 값이 5B134977135E7D13 일때 Name값을 찾아야 한다.

실행 ㄱㄱ



이름과 시리얼을 똑같이 입력하니 역시나 실패한다.

디버거 ㄱㄱ



main의 시작점이다. 이름을 입력 받는다.



핵심인 입력받은 Name값을 Serial로 변형시키는 코드이다. (0x00401077 ~ 0x00401004)


ESI 레지스터값을 3이랑 비교하며 3보다 크거나 같으면 0으로 초기화 한다. (0x00401077 ~ 0x0040107C)


ESI 레지스터값에 따라 xor하는 메모리 번지가 다르다. (0x0040107E)


기본적으로 Name에서 1Byte를 EDX로 읽어와서 ECX와 xor한 뒤 (0x00401088)


Easy_Key.00401150 함수의 인자로 push하여 가공한다. (0x00401094 ~ 0x0040109A)



                    ( 참고로 ESI레지스터를 이용하여 가리키는 스택 번지는 0x0012FE1C에 10,20,30값을 왔다갔다 한다. )



스택에서 10을 ECX로 읽고



Name의 첫 값인 41("A")을 읽어서 xor하면



0x51이 된다.



Easy_Key.00401150 함수호출 뒤 가공된 값이 이렇게 저장이 된다. ASCII 값으로 보면



51이 된다. 따라서 시리얼값을 추출하는 대략적 시나리오는


1. Name에서 1Byte를 읽어들인다.


2. 특정메모리번지값 (10, 20, 30)을 읽어들인다.


3. 두 값을 xor한다.


4. 결과값의 16진수를 ASCII값으로 치환하는 Hex값을 저장한다.



확인을 위해 두번째 루프로 돌입 ( 42("B") xor 20 )



0x36, 0x32가 추가되었다. (little endian 헷갈리지 말자)



62가 맞다.



시리얼 입력 후 비교하는 코드



위 내용을 토대로 시리얼을 입력하니 맞았다. 



해서 5B134977135E7D13시리얼 값을 위 내용을 반대로 하면 Name값을 얻을 수 있다. 

728x90

'ctf + wargame > reversing.kr' 카테고리의 다른 글

Easy Crack  (0) 2015.01.04

+ Recent posts