[picoCTF] Transformation 풀이

Visits: 6

문제

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

끝.

답글 남기기

이메일 주소는 공개되지 않습니다. 필수 필드는 *로 표시됩니다