3P by GN⁺ | ★ favorite | 댓글 1개
  • OFRAK Tetris는 브라우저에서 ARM 명령어가 떨어지는 테트리스형 게임으로, 블록을 맞추는 대신 명령어를 배치해 프로그램 실행 흐름을 만듦
  • 떨어지는 명령어 가젯은 회전한 뒤 고정되며, 고정된 명령어 중 화면 상단에 있는 것만 실행됨
  • 점수는 R12가 가리키는 메모리 주소에 저장되고, R0~R12, LR, PC, SP와 메모리 덤프를 보며 상태를 추적할 수 있음
  • 시간이 다 되거나 잘못된 메모리 접근, 잘못된 주소 점프가 발생하면 Game over가 되어 실행이 종료됨
  • 단일 단계 실행, 음악 토글, 논리 명령어, 무한 모드, 낙하 간격, 최대 가젯 크기 같은 옵션으로 난이도와 실행 방식을 조정할 수 있음

ARM 명령어로 진행되는 테트리스

  • OFRAK Tetris는 ARM 명령어로 구성된 가젯(gadget)이 떨어지는 테트리스형 게임임
  • 사용자는 떨어지는 명령어를 회전한 뒤 왼쪽에 고정해 실행 흐름을 만듦
  • 실행 규칙

    • 명령어는 위에서 아래로 떨어짐
    • 사용자는 명령어를 회전하고 고정함
    • 고정된 명령어 중 맨 위 명령어만 실행

화면에서 확인하는 실행 상태

  • 현재 실행 대상 명령어와 주소가 함께 표시됨
    • 예: add PC, PC, #61
    • 예: 00010000, 00010004, 00010008
  • 레지스터와 메모리 상태를 보며 실행 결과를 추적할 수 있음
    • R0~R12, LR, PC, SP 값이 표시됨
    • 메모리 영역은 16진수 주소와 0으로 채워진 값 형태로 표시됨
    • 점수는 Score: 0처럼 표시됨

점수 저장과 게임 종료 조건

  • 점수는 R12가 가리키는 메모리 주소에 저장됨
  • 다음 중 하나가 발생하면 게임이 끝남
    • 시간이 다 됨
    • 잘못된 메모리에 접근함
    • 잘못된 주소로 점프함
  • 종료 화면에는 Game over.와 최고 점수 입력 영역이 표시됨

조작과 설정

  • 기본 조작은 단일 단계 실행, 가젯 고정, 레지스터 회전, 음악 재생/일시정지, 설명 표시/숨김을 포함함
  • 게임패드 키 바인딩 설정도 제공됨
    • Single Step

    • Toggle Music

    • Lock In

    • Rotate Instructions Up / Down / Left / Right

      • Toggle Game Instructions
      • 게임 설정에서 실행 조건과 난이도를 조정할 수 있음
      • Score multiplier
      • Enable Logical Instructions
      • Infinite mode
      • Seconds between drops
      • Maximum gadget size

DEF CON 현장 이벤트

  • DEF CON에 있는 사용자는 Red Balloon Security 테이블을 방문해 Car Hacking Village에서 Tetris를 함께 플레이할 수 있음
  • 충분히 높은 점수를 얻은 사람에게는 상품이 제공될 예정임

댓글과 토론

Hacker News 의견들
  • 어셈블리 작업 경험이 거의 없는 프로그래머 입장에서, 배우기 좋은 멋진 도구
    각 명령어가 무엇을 하는지 보려고 다른 탭에 치트시트를 띄워두고 있었음
    다만 첫 세그폴트 때문에 최고 점수가 -48억으로 나온 건 좀 실망스러웠음 :-P

  • 정말 멋짐! 지금까지 최고 점수는 65612까지 나왔음
    피드백을 주자면 도움말 메뉴를 열었을 때 닫는 방법이 명확하지 않았고, 아마 ?를 다시 누르는 것만 되는 듯함
    Goblin 음악이 마음에 들고, 명령어를 가지고 놀기 좋은 인터페이스와 색상 구분도 좋음
    명령어 실행 효과를 미리 볼 수 있고 게임이 끝난 뒤 프로그램을 수정할 수 있는 샌드박스 모드가 있으면 ARM 어셈블리를 배우는 사람에게 꽤 유용할 것 같음

    • 샌드박스 모드 아이디어가 마음에 듦
      이 게임을 만들면서 몇 시간 플레이해 보니 ARM 어셈블리를 읽는 속도가 확실히 빨라졌음
  • “점수는 R12가 가리키는 주소의 메모리에 저장됩니다”를 보고 웃을 수밖에 없었음
    공유해줘서 고맙고, DEFCON이 그리워짐. 아마 내년에나 갈 수 있을 듯함

    • R12 때문에 웃은 이유를 공유해줄 수 있음?
    • 명령어나 주소가 뭔지 거의 모르는 입장에서는 “점수는 R12가 가리키는 주소의 메모리에 저장됩니다”가 무엇을 가리키는지 궁금함
      답글 전에 페이지를 띄워둔 상태라 새로고침하기 전까지 답변을 못 봤음
  • 지금까지 써본 좋은 전략은 두 가지임
    첫째, PC를 가능한 많은 레지스터에 뿌리고, 그 레지스터들을 최대한 여러 번 더한 뒤 합계를 0번 주소나 점수가 있는 위치에 저장하는 방식
    둘째, 예전 PC 값에서 조립된 명령어를 정수로 레지스터에 읽어온 뒤, 보통 음수로 보이니 뺄셈으로 음수가 아니게 만든 다음 점수 위치에 저장하는 방식
    다른 사람들이 어떤 전략을 시도했는지 궁금함

  • 컨셉은 정말 멋진데, 내 어셈블리 이해도가 너무 낮음 :)
    점수가 R12에 저장된다고 하는데, R12가 0인데 왜 점수가 16인지 모르겠음
    https://imgur.com/a/RY5jhTu

    • R12에는 점수의 주소가 들어 있음
      이 경우에는 주소 0, 즉 데이터 세그먼트의 시작 지점임
      점수 레지스터는 노란색이고, 그 레지스터가 가리키는 해당 메모리 영역, 즉 실제 점수 바이트들도 노란색으로 표시됨
  • 컴퓨터에는 익숙하고 기본적인 어셈블리도 조금 아는데, 와, 이건 전혀 이해를 못 했음

    • 구체적으로 궁금한 게 있으면 설명해줄 수 있음
      더 넓게는 게임을 더 명확하게 만들 방법에 대한 생각도 궁금함
      명령어를 설명하는 매뉴얼이 도움이 될 건 알지만, 다른 아이디어도 환영함
  • 아름다운 브루탈리즘 UI/UX

  • 해보기 전에 “About”을 눌렀더니 새 페이지가 열리고 이렇게 나옴: “이 사이트를 계속 사용하면 쿠키 사용에 동의하는 것입니다”
    GDPR 위반처럼 보임. 쿠키를 거부하는 방법도 동의만큼 쉬워야 함
    특히 이 쿠키들은 사이트 동작에 필요하지도 않아 보임
    “서비스는 쿠키 및 픽셀 태그, 웹 비콘, 클리어 GIF, JavaScript 같은 유사 기술을 사용해 서버가 웹 브라우저를 인식하고, 방문 및 사용 시점을 파악하고, 추세를 분석하고, 사용자 기반을 이해하며, 서비스를 운영·개선합니다 … 제3자가 기기에 배치한 쿠키를 포함해 제3자로부터 받은 정보로 수집 정보를 보완할 수도 있습니다”
    https://ofrak.com/privacy/#tracking-tools-and-opt-out
    페이지 아래쪽에서 브라우저 설정으로 쿠키를 삭제하라고 하는 건 받아들일 수 있는 해결책이 아님

    • 안타깝게도 이런 관행은 많은 웹사이트에서 벌어지고 있고, 많은 회사가 쿠키 법을 제대로 지키지 않고 있음
      https://www.cnil.fr/en/refusing-cookies-should-be-easy-accep...
    • 내 쪽에는 불법적인 건 저장하지 않고 게임 설정만 저장하던데, 왜 그 배너가 뜨는지 모르겠음
    • 사이트 방문자에게 브라우저에서 쿠키를 비활성화하라고 안내하는 방식은 정확히 apple.com도 쓰고 있음
  • 게임을 어떻게 빌드하는지 궁금함
    https://ofrak.com/docs/environment-setup.html를 살펴봤지만 테트리스 게임에 대한 구체적인 내용을 못 찾았음
    내가 놓친 걸 수도 있음

  • 컨셉이 정말 마음에 듦
    높은 점수를 얻는 핵심은 PC에 0을 쓰는 것처럼 보임
    새 명령어의 바이너리 코드가 오른쪽에 보이는 메모리 영역에 “추가”되고, 이후 R12를 조작해 점수를 최대화할 수 있기 때문임

    • 또 다른 핵심은 R12를 4로 나누어떨어지지 않는 값으로 바꾸는 것임
      모든 명령어가 4바이트이고 최상위 비트가 항상 1이기 때문임
      몇 번은 20억 정도까지 갔지만 평균은 꽤 낮음 ;)