JPG 파일에 다른 파일 심기

“나를 압축해제해주세요”
Source: https://twitter.com/David3141593/status/1057042085029822464

일전에 한 트윗으로 첨부되어 올라온 이미지. (해당 트윗은 현재 플텍 계정이 된 탓에 열람 불가) 이 파일을 다운로드 받아서 확장자를 zip으로 바꾸고 압축을 풀면 분할압축된 rar 파일들이 나오는데, 이들을 압축해제하면 셰익스피어 전체 작품이 나온다. 참고로 모든 압축 해제 프로그램이 다 되는 것은 아닌데, 윈도우에선 7zip으로 해제가 되고 WinRAR나 반디집은 안 됨.

보통 트위터에 이미지를 올리면 리사이징과 메타데이터 삭제와 압축 등의 처리가 이루어지는데 이 트윗의 경우 그게 이루어지지 않았다. 그림 파일을 받아보면 약 1.93메가로 나오는데 아마 이미지의 가로 세로 사이즈가 충분히 작으면 아예 가공을 하지 않는 듯.

이 파일의 트릭은 JPG 파일의 메타데이터에 ZIP 데이터 내부의 RAR 분할파일들을 각각 64KB 내로 욱여넣은 것. (이 경우는 ICC 프로파일에 해당되는 부분이라는 듯?) JPG로 읽을 때엔 파일 맨앞의 이미지만 읽고 나머지는 무시해서 이미지 부분인 언집미 셰익스피어 초상화가 나오는 것이다. ZIP 파일은 파일 끝의 central directory 인덱스를 읽어야 하는데 이 파일은 그 뒤로 다른 바이너리 데이터가 이어지기도 하고 앞에 JPG 파일이 있으니 offset도 잘못 지정되어 일부 프로그램들은 에러를 내놓게 되지만, 7-zip 같은 경우 첫 엔트리를 찾을 때까지 파일 맨앞부터 스캔하고 다른 것은 무시하는지라 (시작 코돈 종결 코돈처럼) 압축이 풀리는 것이라고 한다.

이게 해커뉴스에도 올라온 적이 있는데, 리플에 따르면 2005년경 4chan 같은 곳에서 jpg만 올릴 수 있는 게시판에 이렇게 텍스트를 넣은 zip 파일을 임베딩해서 올리는 식으로 텍본을 공유하는게 유행했었다고. 비슷하게 파일 시작부터 읽어서 끝 지점 마커가 정해진 곳까지만 읽는 포맷은 뒤에 zip 파일을 단순히 붙이는 것만으로도 압축하면 풀리는 파일을 만드는 것이 가능하고 mp3도 그 중 하나이다.

한 편 이런 것도 있는데 jpg 파일 뒤에 garbage가 있어도 무시하고 앞부분만 읽는걸 이용해서 prefix가 지정된 두 데이터가 MD5 해쉬 충돌을 일으키는 것을 찾아내는 식으로 두 이미지 파일이 같은 MD5 해쉬값을 갖게 만들기도 한다. 이 이후엔 같은 MD5 해쉬 값을 갖는 세 번째 이미지 파일을 만들기도.

트윗 타래를 정리. (2018/10/31)

답글 남기기

아래 항목을 채우거나 오른쪽 아이콘 중 하나를 클릭하여 로그 인 하세요:

WordPress.com 로고

WordPress.com의 계정을 사용하여 댓글을 남깁니다. 로그아웃 /  변경 )

Google+ photo

Google+의 계정을 사용하여 댓글을 남깁니다. 로그아웃 /  변경 )

Twitter 사진

Twitter의 계정을 사용하여 댓글을 남깁니다. 로그아웃 /  변경 )

Facebook 사진

Facebook의 계정을 사용하여 댓글을 남깁니다. 로그아웃 /  변경 )

%s에 연결하는 중