Views: 8
문제
I wonder what this really is... enc ''.join([chr((ord(flag[i]) << 8) + ord(flag[i + 1])) for i in range(0, len(flag), 2)])
enc 파일을 다운받아서 열어보면 이상한 글자가 보인다.
灩捯䍔䙻ㄶ形楴獟楮獴㌴摟潦弸弰㑣〷㘰摽
뭔말인지 챗gpt에게 번역을 부탁해보자.
제공된 텍스트는 일부 무의미한 문자와 기호로 이루어진 것으로 보입니다. 번역할 수 있는 형식의 언어 또는 의미 있는 내용이 없기 때문에 특별한 의미가 없는 문자열로 보입니다. 추가 정보나 번역이 필요한 내용이 있다면 자세한 정보를 제공해 주시기 바랍니다.
ㅋㅋㅋㅋㅋㅋ
그냥 하자.
문제에서
''.join([chr((ord(flag[i]) << 8) + ord(flag[i + 1])) for i in range(0, len(flag), 2)])`
이 부분을 해석 해 보자.
글자를 하나 가져와서 flag[i]에 넣은 다음 8비트를 좌측으로 옮기고(2진 쉬프트), 그 빈 자리에 flag[i+1]을 넣은 다음 하나의 글자로 만들고 다시 반복하고... 뭐 그런 작업을 거친 결과물이 enc 파일인 것 같다. 결국 지금 한 글자는 총 16비트.
그럼 이 작업을 반대로 하면 풀리겠지.
path = './enc'
file = File.read(path)
arr = []
arrr = []
for num in 0..18
arr[num] = file.chars[num]
arrr[num] = arr[num].ord >> 8
print arrr[num].chr
res = arr[num].encode("UTF-16").bytes
print res.last.chr
end
코드 설명
path = './enc'
file = File.read(path)
arr = []
arrr = []
이 부분은 해당 파일을 불러오고 배열변수를 선언하는 곳이니 넘어가자.
for num in 0..18
~~
end
0~ᅟ18까지 총 19번 반복한다. 글자수를 알아서 읽도록해도 되지만 어차피 19자니까...ㅋㅋ
arr[num] = file.chars[num]
arrr[num] = arr[num].ord >> 8
print arrr[num].chr
불러온 파일의 한글자를 arr배열에 넣고
arrr배열에는 그 글자를 오른쪽으로 8번 쉬프트한 값을 넣은 후
arrr배열에 있는 값을 텍스트로 출력한다.
puts는 줄바꿈이 있어 보기 힘들고 print는 줄바꿈을 하지 않아 이럴 때 편하다.
res = arr[num].encode("UTF-16").bytes
print res.last.chr
arr 배열에 있는 값을 utf-16으로 인코딩하고 바이트 값으로 바꿔 res에 저장한 다음
끝 1바이트(8비트)만 텍스트로 바꿔 출력한다.
그리고 이 루비 파일을 실행한다.
❯ ruby run.rb
끝.