3 điểm bởi GN⁺ 2024-05-09 | 1 bình luận | Chia sẻ qua WhatsApp
  • Sự cố màn hình kết thúc của NES Tetris không chỉ là việc trò chơi kết thúc đơn thuần, mà còn được tận dụng như một điểm vào để thực thi hành vi mới trên phần cứng và băng game chưa chỉnh sửa
  • Sau cấp 155, nếu việc tính điểm không kết thúc giữa các khung hình, luồng điều khiển sẽ bị phá vỡ và trò chơi có thể đọc nhầm các vị trí RAM ngoài ý muốn như lệnh, dẫn đến thực thi mã tùy ý
  • RAM đầu vào của cổng tay cầm mở rộng trên Famicom trùng với vị trí routine nhảy, cho phép thao tác địa chỉ sẽ chuyển đến sau sự cố bằng đầu vào nút của tay cầm số 3 và 4
  • Displaced Gamers đã công bố mã chứng minh khái niệm đưa đích nhảy tới bảng điểm cao, khiến dữ liệu tên và điểm được đọc như opcode của CPU NES
  • Tính thực dụng còn hạn chế do các ký tự và chữ số có thể nhập cũng như việc thiếu thiết bị lưu trữ, nhưng có khả năng mở rộng thành bản vá tránh sự cố hoặc kiểm soát toàn bộ RAM

Quá trình biến sự cố màn hình kết thúc thành thực thi mã

  • Sự cố của NES Tetris có thể xảy ra khi bộ xử lý điểm số mất quá nhiều thời gian để tính điểm mới giữa các khung hình
    • Tình huống này có thể xuất hiện sau cấp 155
    • Khi có độ trễ, một phần mã điều khiển bị routine ghi khung hình mới làm gián đoạn
    • Sau đó trò chơi nhảy tới một vị trí RAM ngoài ý muốn để tìm lệnh tiếp theo
  • Thông thường, cú nhảy ngoài dự kiến này khiến trò chơi đọc dữ liệu rác ở phần đầu RAM như mã, dẫn đến sự cố nhanh chóng
  • Video gần đây của Displaced Gamers công bố quy trình khiến NES Tetris đọc bảng điểm cao như các lệnh mã máy
    • Các glitch thực thi mã tùy ý tương tự từng được biết đến trong Super Mario World, Paper Mario và The Legend of Zelda: Ocarina of Time
    • Cách cơ bản để đưa mã bên ngoài vào NES Tetris đã được lý thuyết hóa công khai ít nhất từ năm 2021, và được cho là trong cộng đồng cũng đã biết từ lâu phương pháp kiểm soát toàn bộ RAM

Kiểm soát vị trí nhảy bằng xử lý đầu vào của Famicom

  • Cách hack này không chỉ dựa vào cơ chế sự cố của Tetris mà còn phụ thuộc vào cấu trúc đầu vào của Famicom
  • Khác với NES bản Mỹ, Famicom bản Nhật có hai tay cầm nối cố định vào thân máy, còn tay cầm bên thứ ba có thể nối vào cổng mở rộng phía trước
  • Mã Tetris đọc đầu vào từ cổng tay cầm “bổ sung” này
    • Dùng adapter có thể kết nối thêm hai tay cầm NES tiêu chuẩn
    • Famicom có một phiên bản Tetris riêng của Bullet-Proof Software, nhưng đặc tính xử lý đầu vào này hoạt động trong mã NES Tetris
  • Vùng RAM xử lý đầu vào tay cầm bổ sung trùng với vị trí bộ nhớ của routine nhảy được dùng khi xảy ra sự cố
    • Khi routine nhảy bị gián đoạn do sự cố, RAM đó chứa dữ liệu biểu thị các nút đang được nhấn trên tay cầm
    • Người chơi có thể dùng giá trị này để kiểm soát chính xác vị trí mã trò chơi sẽ chuyển đến sau sự cố

Đọc bảng điểm cao như mã thực thi

  • Cách kiểm soát nhảy của Displaced Gamers yêu cầu đầu vào tay cầm cụ thể
    • Nhấn up trên tay cầm số 3
    • Nhấn right, left, down trên tay cầm số 4
    • Cần thao tác tay cầm để nhập leftright cùng lúc
  • Đầu vào này đưa mã nhảy tới vùng RAM lưu tên và điểm trong danh sách điểm cao của trò chơi
  • Nếu đặt (G vào vị trí mục tiêu của bảng điểm cao B-Type, trò chơi sẽ nhảy tiếp sang một vùng khác của bảng điểm cao
  • Sau đó trò chơi đọc lần lượt tên và điểm, rồi xử lý chúng như opcode của CPU NES theo cách mà Displaced Gamers gọi là mã “bare metal”

Khả năng và giới hạn mà chứng minh khái niệm cho thấy

  • Vùng nhập tên điểm cao chỉ có thể dùng 43 ký hiệu, còn điểm số chỉ có thể chứa 10 chữ số
    • Vì hạn chế này, chỉ một phần opcode khả dụng trên NES có thể được “lập trình” vào bảng điểm cao
  • Dù chỉ với đầu vào hạn chế, vẫn có thể tạo mã chứng minh khái niệm ngắn
    • Dữ liệu ví dụ gồm tên ))"-P) và điểm 8.575 ở hạng 2 A-Type
    • Routine này đặt hai chữ số cao nhất của điểm trò chơi về 0
    • Nó giảm thời gian xử lý điểm, qua đó giảm nguyên nhân gây sự cố, nhưng nếu tiếp tục chơi, điểm số sẽ lại đạt tới “vùng nguy hiểm” gây sự cố
  • NES Tetris gốc không có bộ nhớ lưu bằng pin, nên mỗi lần bật nguồn đều phải tự tạo điểm cao và tên phức tạp cần thiết
  • Không gian bảng điểm cao cũng hạn chế, nên khó đưa trực tiếp các chương trình phức tạp lên trên mã thật của Tetris
  • HydrantDude viết rằng có một cách tạo bootstrapper bằng tổ hợp tên và số điểm cao cụ thể, rồi tạo tiếp một bootstrapper khác để giành quyền kiểm soát toàn bộ RAM

Khả năng tái lập trình vượt ra ngoài việc tránh sự cố

  • Nếu có thể kiểm soát toàn bộ RAM, các người chơi hàng đầu cũng có thể lập trình lại trò chơi để vá lỗi gây sự cố của NES Tetris
  • Cách này có thể đặc biệt hữu ích cho những người chơi muốn vượt qua cấp 255
    • Sau cấp 255, trò chơi quay lại Level 0
  • Nếu mở rộng cùng nguyên lý này hơn nữa, cũng có thể tạo các biến thể như biến Tetris thành Flappy Bird, giống trường hợp các speedrunner Super Mario World

1 bình luận

 
GN⁺ 2024-05-09
Ý kiến trên Hacker News
  • Những exploit kiểu này luôn khiến tôi nhớ đến giai đoạn cuối cùng tối thượng của hacking trong Accelerando của Stross: “thực hiện một cuộc tấn công timing channel vào siêu cấu trúc tính toán của chính không-thời gian, nhằm chọc thủng vào thứ gì đó nằm bên dưới nó”

    • Tôi không muốn ở trong nón ánh sáng của bất kỳ ai đang thực hiện một nỗ lực dù chỉ có chút khả năng thành công nào
      Nghe như một cách rất hay để gây ra phân rã chân không và khiến vũ trụ bị màn hình xanh
    • Có thể tải miễn phí cuốn sách này từ blog của tác giả: https://www.antipope.org/charlie/blog-static/fiction/acceler...
    • Tôi vừa phát hiện một lỗi đồng bộ, có lẽ đây là một ca biên tốt để bắt đầu: https://www.science.org/content/article/quantum-paradox-poin...
    • Tôi nghĩ người ta thường gọi thứ đó là vật lý
    • Không-thời gian? Sao chỉ giới hạn ở không gian, meta-time thú vị hơn nhiều
  • Tôi thật sự thích những người như thế này
    Đến mức tôi thấy hơi xấu hổ vì mình không có tinh thần hacker để làm những việc nhiều khả năng là vô dụng chỉ vì vui

    • Phần lớn những hacker như vậy có phải sinh ra đã ngậm quỹ tín thác không? Những người có tương lai đảm bảo và chỉ còn biết buồn chán?
      Phần còn lại chúng tôi bận kiếm sống đến mức không có thời gian làm những exploit kiểu này, không cố ý chơi chữ đâu
  • Nếu bạn không muốn đọc toàn bộ bài nhưng đang thắc mắc “Tôi tưởng băng NES chạy từ ROM chứ?”, thì đúng vậy
    Chỉ là exploit này khiến CPU nhảy vào RAM dùng để lưu bảng điểm cao. Quá tuyệt

  • Quá trình đạt được thực thi mã tùy ý luôn thú vị hơn việc sau đó làm gì
    Sự kiên trì trong việc mổ xẻ game để tìm ra khi nào và ở đâu nó làm hành vi đó, rồi tìm xem phải thao tác chỗ nào để nhập lệnh, thật đáng khâm phục

    • Ngay cả sau khi tìm ra exploit, bạn vẫn có thể tạo ra thứ gì đó thật đẹp để console chạy
      Pokemon Yellow: https://www.youtube.com/watch?v=Vjm8P8utT5g
      Super Mario World: https://www.youtube.com/watch?v=hB6eY73sLV0
    • Tôi đặc biệt thích trường hợp Super Mario World
      Thực thi mã tùy ý được kích hoạt bằng shellcode thật sự. Theo đúng nghĩa đen là thao tác vỏ Koopa trong game để chạy nó
  • Mất bao lâu nữa sẽ có người chạy được Doom trong Tetris?

    • Có lẽ việc đó sẽ cần một băng mở rộng RAM
  • Thời gian được lãng phí đúng cách

    • Bạn làm gì để giải trí? Bạn cũng xem đó là lãng phí thời gian à?
      Tôi hỏi thật lòng. Trước đây tôi cũng từng nghĩ những việc vui vẻ là lãng phí thời gian, nhưng càng lớn tuổi, sau khi trả giá cho một cuộc sống căng thẳng cao kéo dài, tôi càng nghĩ khác đi
  • Tôi muốn thử làm việc này với Factorio
    Kiểu như xây một máy tính khổng lồ bằng băng chuyền trong Factorio, rồi gây segmentation fault để thoát ra ngoài game

  • Việc tìm ra thực thi mã tùy ý trong các game cũ thật sự cuốn hút
    Khi tôi thấy chuyện như vậy trong Super Mario World vài năm trước, tôi đã bị ám ảnh một thời gian về việc làm sao nó có thể xảy ra
    Tôi nói theo nghĩa tốt, như một lời khen, dù nghe có thể hơi xấu tính: tôi thích việc những người thật sự thông minh dành lượng thời gian và công sức khổng lồ cho những việc hoàn toàn vô dụng
    Có lý do thực tế tức thời nào để tiêm mã vào NES Tetris không? Có lẽ là không. Nhưng trọng tâm không nằm ở đó, mà là tìm xem điều gì có thể làm được và có thể ép mã cũ cùng những máy tính nguyên thủy đi xa đến đâu
    Theo nghĩa cổ điển thì nó có thể không “hữu ích”, nhưng Sudoku, ô chữ, hay ngay từ đầu việc chơi NES Tetris cũng vậy

    • Dù bị che khuất bởi các chi tiết kỹ thuật, exploit này cũng có mục đích thực dụng
      Nó cho phép các cao thủ tránh crash để chơi lâu hơn sau một điểm nhất định vốn chặn họ chơi tiếp
      Với người chơi trung bình thì không có nhiều tính thực dụng, nhưng với những người muốn cạnh tranh điểm cao, nó giải quyết một giới hạn và mở ra khả năng thi đấu mới
    • Rất nhiều khám phá khoa học được tạo ra theo cách những người thật sự thông minh dành thời gian và công sức cho những việc hoàn toàn vô dụng
      Lý thuyết số vốn từng bị xem là vô dụng, nhưng giờ thực chất chống đỡ gần như toàn bộ mật mã khóa công khai
    • Nó không vô dụng. Họ thích làm việc đó
      Công dụng mà người khác thu được từ những việc tôi làm nhưng không thích chỉ là phụ phẩm may mắn, hoặc là thứ gián tiếp có lợi cho tôi như tiền bạc hay sự công nhận
      Việc làm vì yêu thích là dạng hữu dụng trực tiếp nhất đối với người quan trọng nhất, tức chính bản thân mình
    • Kênh YouTube của người này chính là tinh túy của những thứ như vậy: https://www.youtube.com/@tom7
  • Thành thật mà nói, tôi ngạc nhiên là Tetris đến tận bây giờ mới bị phá
    Có vẻ việc này sẽ mở ra một kỷ nguyên chạy any% mới. Mục tiêu là kích hoạt cảnh kết thúc hoặc credit của game càng nhanh càng tốt
    Ví dụ tôi thích là Ocarina of Time, vốn đã có exploit ACE từ vài năm trước
    Game bị hỏng hoàn toàn, đến mức bạn có thể “phá đảo” trong vài phút bằng cách thao tác bộ nhớ game và chỉnh một warp lối vào cụ thể
    Điều còn đáng kinh ngạc hơn là người ta chỉnh bộ nhớ bằng tay, chỉ với vài nút bấm và cần analog
    Một trường hợp hiện credit trong 3 phút: https://www.speedrun.com/oot/runs/z1l1627m

    • Tôi cũng từng thấy thứ tương tự trong Super Mario
      Khi phát hiện lỗi ở đường hầm warp, nó kích hoạt đọc ngoài phạm vi, và trước đó người chơi đã dùng thao tác joystick để ghi các byte ngay bên ngoài buffer nhằm tạo ra hành vi mong muốn
      Trong một game Pokemon nào đó, người chơi phải thực hiện rất nhiều giao dịch mua/bán để chuẩn bị bộ nhớ chính xác, rồi làm tràn số lượng vật phẩm để kích hoạt cú nhảy
      Thật sự kỳ diệu. Một ngày nào đó nếu người ngoài hành tinh tấn công, những trò nghịch này sẽ cứu chúng ta
    • Chỉ đọc bài thì có vẻ khả năng đó không cao
      ACE này dường như chỉ成立 sau khi trước hết đạt tới kill screen
      Hãy tưởng tượng ACE của Ocarina of Time chỉ kích hoạt sau khi credit kết thúc đã chạy xong; khi đó nó chỉ xảy ra sau khi bạn đã hoàn thành thành công, nên không thể rút ngắn kỷ lục
    • Bạn nói thật lòng là ngạc nhiên Tetris đến tận bây giờ mới bị phá, nhưng tôi tò mò trước đó điều gì khiến bạn nghĩ rằng thực thi tùy ý là khả thi
  • Tôi thật sự thích kiểu công việc này
    Nó làm tôi nhớ đến lần người ta dùng glitch để lập trình Flappy Bird bên trong Super Mario World. Điên rồ thật
    https://www.youtube.com/watch?v=hB6eY73sLV0