Reversing.kr - Easy Keygen Write up

CTF 중점 스터디

2019. 11. 12. 18:12

 

죄송합니당 게을러서 저번주에 올리려다가 못올렸어욤.. 반성으로 이번주에 두 개 올리겠습니다.

 

Name과 그 에 맞는 Serial 값을 입력받고 맞으면 Correct 틀리면 Wrong 이 뜨는 프로그램이다. ReadMe 파일에서 Serial 값을 주고있다.

 

 

흐름을 파악하기 위해 IDA 와 디버거로 열어보았다.

코드를 설명해보면!

1번 - NAME 을 입력받는다.

2번 - 입력한 name 의 길이를 구해 ecx에 저장한다.

3번 - 입력받은 name을 어떤 알고리즘을 거친후 19fe7c 주소에 쓰고

 

19fe7c에 쓰여진 값과  입력된 Serial 값을 비교한다.!!

 

위의 3번 알고리즘 부분에 대해서 파이썬 코드로 작성해보면

name = input("name을 입력하세요\n")
k = 1
serial = list()
for i in range(len(name)):		
    key = hex(ord(name[i]) ^ (k * 16))	# 입력받은 name 값을 한글자씩 10,20,30 순서대로 xor 연산을 하는부분
    if k >= 3 :  #  }
        k = 0    #  } 	-> 10, 20, 30 을 반복하기 위한 부분!!!! 
    k += 1       #  } 
    serial.append(key)
    
print(serial)

이렇게 Serial 값을 구할 수 있다!

 

하지만 우리는 Serial 값으로 name 을 구해야 하므로 

serial = input("serial 값을 입력하세요\n")
k = 1
for i , j in zip(serial[::2] , serial[1::2]):		
    serial_combine = i+j			# 나눈 두 글자를 합쳐준다!
    name += chr(int(serial_combine,16) ^(16 * k))	# 한 글자씩 10, 20, 30과 XOR 연산을 해준다.! 
    if k >= 3:
        k = 0
    k += 1
    
print(name)

이렇게 코드를 작성해보면 

name 을 알 수 있다.

따라서 정답은 : K3yg3nm3 이다.

 

# 확실하게 알게 된 내용 

1. y = x ^ z 이면 x = y ^ z 이당

2. 문자열 길이 구할 때 가끔 쓰이는 코드

or ecx ffffffff
xor eax eax
repne scasb	// eax와 edi(보통 입력받은 변수가 저장되어있음)을  반복해서 비교한 후 ecx 값을 변환
not ecx		// ecx 로 반대로 바꾼 후	
dec ecx		// null 값 제거 !

 

 

'CTF 중점 스터디' 카테고리의 다른 글

N00bCTF What is bof?  (0) 2019.11.18
Pwnable.kr_bof5 WriteUp  (0) 2019.11.17
Newbie CTF REC Write up  (0) 2019.11.11
N00bCTF - Over the RET Write-up  (0) 2019.11.10
Wargame.kr_db is really good_Write up  (0) 2019.11.03