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