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
728x90

올리로 열어 봅시다.




문자열이나 찾아 봅시다.




축하한다니.. 굉장히 수상하니 가 봅시다.




역시나 성공의 메시지박스를 띄우는 문자열이었습니다. 나란히 실패 메시지도 있습니다.

그리고 아마도 빨간네모로 표시한 부분이 마지막 분기점인 것 같습니다.

혹시 모르니 breakpoint를 걸어 둡시다.


위로 조금 올라가면




getDlgItemTextA함수를 호출하는 부분이 있습니다.


우리가 입력한 값을 읽기 위한 함수 일 것입니다. 역시 breakpoint 를 걸어두고 이제 실행하여


갑을 입력합시다.




저는 CrackMe라는 문자열을 입력하였습니다. 그리고 확인!



break를 걸어두었던 GetDlgItemText로 왔습니다.


근데 현재 비교문에서 헥사값61과 다르면  진행해보시면 알겠지만 종료가 됩니다.


밑에 확인해 보니



'r'입니다. 우리가 입력한 CrackMe의 두번째 바이트인 것을 알 수 있습니다. 따라서


일단 두번쨰 바이트는 헥사값61 즉 'a'라는 것을 알았습니다. 바꿔서 진행합시다.




이번에 "CarckMe"로 진해해 보면 앞선 비교문에서는 정상 진행하는 것을 볼 수 있습니다.




ECX레지스터의 위치에 입력한 값이 3번째 바이트 부터 있는 것이 보이며


밑에 00401135(실패 메시지)로 가는 분기가 있는 것을 보니


00401150 안에서 뭔가 있을 것 같습니다. follow 합시다.




쭉 보니 아까 위에서 push한 "5y"와 3,4번째 바이트를 비교하고 있습니다.


우리는 EAX를 0으로 만들어야 하므로(401150호출후 분기 TEST EAX,EAX)


입력을 다시 해 보겠습니다.






3, 4번째를 "5y"로 바꾸어 입력해서 넘어왔지만 새로운 난관이 있습니다.


이번에는 5번째바이트 부터 저기 "R3versing"이랑 비교를 합니다. 이 하 과정 생략하고


다시 입력하면




마지막 난관 처음에 break 걸어두었던 마지막 분기점으로 왔습니다. 이번에는

첫 바이트를 비교하고 있습니다. 이제 첫 바이트만 변경하면 올바른 값이 출력 될 것입니다.




요렇게!!  (답은 가려주는 센스)

728x90

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

Easy Keygen  (0) 2015.11.27

+ Recent posts