리버싱CTF/Crackmes

SD4RK's KeyMe

우와해커 2020. 6. 28. 21:59

A simple CrackMe, you have to write a keygen. All other info is in the README. Good luck :

 simple CrackMe,u have to write a keygen. All other info is in the README. Good luck 

Easy, C/C++, Windows 

 

A simple CrackMe, you have to write a keygen. All other info is in the README. Good luc

KeyGenCrackMe.rar
0.09MB

 

그래프를 봐도 루틴 파악이 어렵네요..

머리가 나빠서 코드 하나씩 실행해가며 해석하였고

5시간 정도 멍떄리다 3시간 집중해서 겨우 풀었습니다 ㅎㅎ 미친 내 소중한 일요일...

 

 

 

문자 6번째까지의 연산

str[0]=str[0]&0xE0 
str[1]=str[1]&0xE0 
str[2]=str[2]&0xE0 
.... 
str[5]=str[5]&0xE0 

if(str[i] == 0x20)

- .......아무 값이나 들어와도 되는줄 알았는데, 0xE0와 and연산 이후 결과가 0x20(32)이 나와야한다.

=> 숫자와 연산하였을 때, 충족하고 대소문자와 연산하였을 때 충족이 안되었다.

>>> hex(0xE0 & int(ord('A')))
'0x40'

>>> hex(0xE0 & int(ord('a')))
'0x60'

>>> hex(0xE0 & int(ord('0')))
'0x20'

>>> hex(0xE0 & int(ord('9')))
'0x20'

=> 1~6번째 자리는 숫자

 

 


7번째~9번째자리 연산

esi = 0   + 0x36(6) 
esi = esi + 0x37(7) 
esi = esi + 0x38(8) 

- 7번째는 고정, 이후 문자는 계쏙 이전 문자 코드 값을 더하게 된다.

 

 

10번째 문자 연산

if(str[6]+str[7]+str[8] & 0xFFFFFF00 == 0x100) 

- 이전자리 수까지 더한 값에 &0xFFFFFF00연산이 256(0x100)이여야 한다.

- 256을 3으로 나누면 85, 7~9번째 문자는 아스키 값 (86,0x56,V)이상 입력해야 한다.
=>012345VVV

if(str[9] == (256,0x100,'@') )

- 10번째 문자는 @여야만 한다.
=>012345VVV@

 

 

11~13번째 문자 연산

eax = (str[10]+str[10])/3 

- eax 두번 더 한다, 이것은 의미 없다, 3으로 나누었을 때, 딱 떨어져야 한다. 즉, 3의 배수여야 한다.
=>012345VVV@369

 



14~16번째 문자

eax = str[13] 
cdq?? => edx가 0이 됨  
eax = eax - edx 
eax = eax >>1는 eax/2 이다. 
eax = eax & 0xFFFFFFF0 
if(eax == 0x20) 
 반복 

코드 정리

eax/2 & 0xFFFFFFF0 == 0x20 

- eax를 2로 나누고 & 0xFFFFFFF0 연산 결과는 0x20이 되려면 '@'(0x40,6)이상 와야된다.

- 콘솔로 대강 테스트해본 결과, 대문자만 충족되었다.

>>> hex(0xFFFFFFF0 & int(ord('a')/2))
'0x30'

>>> hex(0xFFFFFFF0 & int(ord('A')/2))
'0x20'

>>> hex(0xFFFFFFF0 & int(ord('0')/2))
'0x10'

=> 14~16번째 문자는 소문자.

 

 

 

키젠 생성 코드

 

import random
import string

#1~6번째 문자 생성 랜덤한 6개의 숫자 생성
result =""
_LENGTH=6
digit_pool= string.digits
for val in range(_LENGTH):
    result += random.choice(digit_pool)

#7~9번째 문자 생성
my_pool = "VWXYZ"
for val in range(3):
	result += random.choice(my_pool)


#10번째 문자 '@' 결합
result += '@'

#11~13번째 문자, 16진수 아스키코드를 뽑아낼 수 있지만 
# 피곤하니까 나중에 해보도록 하자 ㅠ
sam69 = "369"
for val in range(3):
	result += random.choice(sam69)

#14~16번째 문자, @,0x40 이상의 아스키코드를 붙여주면 된다. 
#0xFFFFFFF0와의 And연산 후 0x20 조건을 만족시키기 위해 @와 알파벳 대문자만 가능하다.
mypool2= '@' + string.ascii_uppercase
for val in range(3):
	result += random.choice(mypool2)

print result	
#
#hex(ord('C'))[2:]

난수코드 생성 참고: https://hongku.tistory.com/297

 

 

 

 

'리버싱CTF > Crackmes' 카테고리의 다른 글

raxer's Simple Crackme  (0) 2020.06.26