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
그래프를 봐도 루틴 파악이 어렵네요..
머리가 나빠서 코드 하나씩 실행해가며 해석하였고
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 |
---|