반응형
http://reversing.kr/challenge.php
[문제]
[풀이]
ReversingKr KeygenMe
Find the Name when the Serial is 5B134977135E7D13
위 텍스트 파일과 프로그램 하나가 주어진다.
보니까 name값을 어찌저찌 인코딩한 값과 serial 값이 같으면 문제가 풀리는게 아닐까?
IDA 써서 바로 분석 시작.
name이랑 serial 두 개 입력받는게 보이고,
예상대로 name을 xor 된 값과 serial을 비교해서 같으면 Correct!가 뜬다.
일단 name을 입력받으면
v3 = 0;
for ( i = 0; v3 < (int)strlen(v8); ++i )
{
if ( i >= 3 )
i = 0;
sprintf(Buffer, "%s%02X", Buffer, v8[v3++] ^ v7[i - 1]);
}
위 방법으로 인코딩 되는데
v3와 i는 카운팅 되는 변수 같고
v8은 입력받은 값이다.
Buffer에다가 인코딩된 값을 + 시켜서 문자열을 만든다.
v7을 확인하면
0x10, 0x20, 0x30 가 들어간다.
name = "K3yg3nm3"
nameList = list(name)
buffer = ""
v3 = 0
v7 = [0x10, 0x20, 0x30]
i = 0
while v3 < len(name):
if i >= 3:
i = 0
buffer += " " + str(hex(ord(nameList[v3]) ^ v7[i]))
v3 += 1
i += 1
print(buffer)
보기 힘들어서 Python으로 코드를 옮겼다.
코드를 해석해보면
5B134977135E7D13 이 값은
16진수를 이어붙인 값 같다.
0x5B, 0x13, 0x49, ... 이렇게
serial = [0x5B, 0x13, 0x49, 0x77, 0x13, 0x5E, 0x7D, 0x13]
flag = ""
v3 = 0
v7 = [0x10, 0x20, 0x30]
i = 0
while v3 < len(serial):
if i >= 3:
i = 0
flag += chr(serial[v3] ^ v7[i])
v3 += 1
i += 1
print(flag)
name 값이 출력됨
Auth에 넣으면 문제 풀림.
[FLAG]
K3yg3nm3
반응형