이모지만으로 유용한 DOS 실행 파일을 만들 수 있을까

3 days ago 12

UTF-8 이모지의 바이트열을 8088 명령어로 직접 해석해, 이모지만으로 작동하는 DOS 실행 파일을 만들 가능성을 탐색함 여러 이모지가 0xF0 0x9F로 시작하며, 8088에서는 각각 LOCK 접두사와 LAHF가 되므로 AH 레지스터가 계속 손상되는 제약 속에서 나머지 바이트를 활용해야 함 조사 과정에서 FWAIT, STOSB, CBW, SCASB와 덧셈처럼 쓸 수 있는 뺄셈을 발견했으며, 개구리 이모지의 F0 9F 90 B8은 마지막 B8을 MOV AX, immediate 로 해석할 수 있음 DOS가 COM 프로그램 시작 시 스택에 넣는 0을 비공식 POP AX 별칭인 8F F0으로 꺼내 AX를 0으로 초기화하고, CGA 비디오 메모리 근처의 주소를 얻어 문자를 쓰는 방식을 구상함 작은 로더와 이모지 인코더를 결합하면 처음 예상한 32KiB 규모의 복잡한 우회 없이 구현할 수 있으며, 궁극적으로 이모지 기반 LLVM 백엔드까지 상정함 UTF-8 이모지를 8088 코드로 해석하기 여러 UTF-8 이모지 코드 포인트는 0xF0으로 시작하며, 이는 8088에서 비교적 무해한 LOCK 접두사로 작동함 예시 바이트열 F0 9F 92 AF는 다음 명령어로 해석됨 F0 9F: lock lahf 92: xchg dx,ax AF: scasd 두 번째 바이트 9F는 LAHF이므로 실행할 때마다 AH를 덮어씀 이 부작용을 상수처럼 받아들이면 이모지 바이트의 절반가량을 활용할 수 있음 DOS 인터럽트 호출에는 AH가 필요한 경우가 있어 중요한 제약으로 남음 활용 가능한 명령어 찾기 조사 대상 이모지는 3,717개였지만 F0 9F B0-BF로 시작하는 항목은 찾지 못함 이 범위가 있었다면 mov reg,imm 명령어를 얻을 수 있었음 많은 다른 이모지는 E2로 시작해 8088의 LOOP가 되며, E3은 JCXZ가 됨 단독으로는 크게 유용하지 않지만 다른 명령어를 완성하는 바이트로 활용할 가능성이 있음 컬러로 표시되는 키캡 문자도 이모지 후보에 포함했으며, 일부 바이트 조합은 ALU 연산에 활용할 수 있음 모래시계 이모지의 바이트열은 명령어로 해석하면 FWAIT 가 됨 포인터 이동과 메모리 쓰기 한 이모지 바이트열은 cbw; scasb가 되어 포인터를 증가시키는 데 사용할 수 있음 다른 바이트열은 xchg cx,ax; sub di,8FB8h로 해석됨 xchg는 불필요한 잡음으로 취급할 수 있음 sub di,8FB8h는 7048h...

Read Entire Article