시리얼 값이 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값을 얻을 수 있다.
'ctf + wargame > reversing.kr' 카테고리의 다른 글
Easy Crack (0) | 2015.01.04 |
---|