3 คะแนน โดย GN⁺ 2023-08-12 | 1 ความคิดเห็น | แชร์ทาง WhatsApp
  • OFRAK Tetris เป็นเกมสไตล์เททริสในเบราว์เซอร์ที่มีคำสั่ง ARM ร่วงลงมา โดยแทนที่จะต่อบล็อก ผู้เล่นจะวางคำสั่งเพื่อสร้างลำดับการทำงานของโปรแกรม
  • instruction gadget ที่ร่วงลงมาจะถูกหมุนแล้วล็อกเข้าที่ และในบรรดาคำสั่งที่ถูกล็อกไว้ จะมีเพียงคำสั่งที่อยู่บนสุดของหน้าจอเท่านั้นที่ถูกประมวลผล
  • คะแนนจะถูกเก็บไว้ที่ ที่อยู่หน่วยความจำที่ R12 ชี้อยู่ และสามารถติดตามสถานะได้โดยดู R0~R12, LR, PC, SP และ memory dump
  • หากหมดเวลา หรือเกิดการเข้าถึงหน่วยความจำผิดพลาด หรือกระโดดไปยังที่อยู่ที่ไม่ถูกต้อง จะกลายเป็น Game over และการทำงานจะสิ้นสุดลง
  • สามารถปรับความยากและวิธีการทำงานได้ด้วยตัวเลือกอย่าง single-step execution, สลับเพลง, logical instructions, โหมดไม่สิ้นสุด, ช่วงเวลาระหว่างการร่วง และขนาด gadget สูงสุด

เททริสที่ดำเนินไปด้วยคำสั่ง ARM

  • OFRAK Tetris เป็นเกมสไตล์เททริสที่มีกาเจ็ต (gadget) ซึ่งประกอบด้วยคำสั่ง ARM ร่วงลงมา
  • ผู้ใช้จะหมุนคำสั่งที่กำลังร่วง แล้วล็อกไว้ทางด้านซ้ายเพื่อสร้างลำดับการทำงาน
  • กติกาการทำงาน

    • คำสั่งจะร่วงจากบนลงล่าง
    • ผู้ใช้สามารถหมุนและล็อกคำสั่งได้
    • ในบรรดาคำสั่งที่ถูกล็อกไว้ จะประมวลผลเฉพาะคำสั่งบนสุดเท่านั้น

สถานะการทำงานที่ตรวจสอบได้บนหน้าจอ

  • จะแสดงคำสั่งที่กำลังถูกประมวลผลพร้อมที่อยู่
    • ตัวอย่าง: add PC, PC, #61
    • ตัวอย่าง: 00010000, 00010004, 00010008
  • สามารถติดตามผลการทำงานได้จากสถานะของรีจิสเตอร์และหน่วยความจำ
    • จะแสดงค่า R0~R12, LR, PC, SP
    • พื้นที่หน่วยความจำจะแสดงเป็นที่อยู่แบบเลขฐานสิบหกและค่าที่ถูกเติมด้วย 0
    • คะแนนจะแสดงในรูปแบบ Score: 0

การเก็บคะแนนและเงื่อนไขจบเกม

  • คะแนนจะถูกเก็บไว้ที่ ที่อยู่หน่วยความจำที่ R12 ชี้อยู่
  • เกมจะจบลงเมื่อเกิดข้อใดข้อหนึ่งต่อไปนี้
    • หมดเวลา
    • เข้าถึงหน่วยความจำที่ไม่ถูกต้อง
    • กระโดดไปยังที่อยู่ที่ไม่ถูกต้อง
  • หน้าจอจบเกมจะแสดง Game over. และพื้นที่สำหรับกรอกคะแนนสูงสุด

การควบคุมและการตั้งค่า

  • การควบคุมพื้นฐานประกอบด้วย single-step execution, การล็อก gadget, การหมุนรีจิสเตอร์, เล่น/หยุดเพลงชั่วคราว และแสดง/ซ่อนคำอธิบาย
  • ยังมีการตั้งค่าปุ่มสำหรับเกมแพดด้วย
    • 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 เพื่อเล่น Tetris ร่วมกันได้ที่ Car Hacking Village
  • ผู้ที่ทำคะแนนได้สูงพอจะได้รับรางวัล

1 ความคิดเห็น

 
GN⁺ 2023-08-12
ความคิดเห็นจาก Hacker News
  • ในฐานะโปรแกรมเมอร์ที่แทบไม่มีประสบการณ์ทำงานกับ assembly เลย นี่เป็นเครื่องมือเจ๋งๆ ที่เหมาะมากสำหรับการเรียนรู้
    ผมเปิดชีตสรุปคำสั่งไว้ในแท็บอื่นเพื่อดูว่าแต่ละคำสั่งทำอะไร
    แต่ก็ผิดหวังนิดหน่อยที่ segfault ครั้งแรกทำให้คะแนนสูงสุดออกมาเป็น -4.8 พันล้าน :-P

  • เจ๋งมาก! คะแนนสูงสุดที่ทำได้จนถึงตอนนี้คือ 65612
    ถ้าจะให้ฟีดแบ็ก ตอนเปิดเมนูช่วยเหลือ วิธีปิดยังไม่ชัดเจน และดูเหมือนจะทำได้แค่กด ? อีกครั้ง
    ชอบเพลง Goblin และอินเทอร์เฟซกับการแยกสีที่เหมาะกับการลองเล่นกับคำสั่งก็ทำได้ดี
    ถ้ามีโหมด sandbox ที่ให้ดูผลของการรันคำสั่งล่วงหน้าได้ และแก้โปรแกรมได้หลังเกมจบ น่าจะมีประโยชน์มากสำหรับคนที่กำลังเรียน ARM assembly

    • ชอบไอเดียโหมด sandbox
      หลังจากเล่นไปหลายชั่วโมงระหว่างทำเกมนี้ ผมรู้สึกชัดเจนว่าอ่าน ARM assembly ได้เร็วขึ้น
  • เห็นประโยค “คะแนนถูกเก็บไว้ในหน่วยความจำที่อยู่ตาม address ที่ R12 ชี้ไป” แล้วอดขำไม่ได้
    ขอบคุณที่แชร์ ทำให้คิดถึง DEFCON คงได้ไปอีกทีปีหน้า

    • แชร์ได้ไหมว่าทำไมถึงขำเรื่อง R12?
    • ในฐานะคนที่แทบไม่รู้ว่าคำสั่งหรือ address คืออะไร ผมสงสัยว่า “คะแนนถูกเก็บไว้ในหน่วยความจำที่อยู่ตาม address ที่ R12 ชี้ไป” หมายถึงอะไร
      ผมเปิดหน้าไว้ก่อนที่จะมีคนตอบ เลยไม่เห็นคำตอบจนกว่าจะรีเฟรชหน้า
  • กลยุทธ์ดีๆ ที่ลองใช้มาจนถึงตอนนี้มีสองแบบ
    แบบแรกคือกระจาย PC ไปยัง register ให้มากที่สุดเท่าที่ทำได้ แล้วเอา register เหล่านั้นมาบวกซ้ำให้ได้มากที่สุด จากนั้นเก็บผลรวมไว้ที่ address 0 หรือที่ตำแหน่งของคะแนน
    แบบที่สองคืออ่านคำสั่งที่ประกอบขึ้นจากค่า PC ก่อนหน้าเข้ามาใน register ในรูปจำนวนเต็ม ซึ่งโดยมากจะดูเหมือนเป็นค่าติดลบ แล้วใช้การลบทำให้ไม่ติดลบ จากนั้นเก็บไว้ที่ตำแหน่งคะแนน
    อยากรู้ว่าคนอื่นลองกลยุทธ์อะไรกันบ้าง

  • คอนเซปต์เจ๋งจริงๆ แต่ความเข้าใจ assembly ของผมต่ำเกินไป :)
    บอกว่าคะแนนถูกเก็บไว้ที่ R12 แต่ R12 เป็น 0 แล้วทำไมคะแนนถึงเป็น 16 ก็ไม่เข้าใจ
    https://imgur.com/a/RY5jhTu

    • ใน R12 มี address ของคะแนนอยู่
      ในกรณีนี้คือ address 0 หรือจุดเริ่มต้นของ data segment
      register คะแนนเป็นสีเหลือง และพื้นที่หน่วยความจำที่ register นั้นชี้ไป ซึ่งก็คือ byte คะแนนจริงๆ ก็ถูกไฮไลต์เป็นสีเหลืองด้วย
  • ผมคุ้นเคยกับคอมพิวเตอร์และรู้ assembly พื้นฐานอยู่นิดหน่อย แต่โอ้โห อันนี้ไม่เข้าใจเลย

    • ถ้ามีจุดไหนที่สงสัยเป็นพิเศษ ผมอธิบายให้ได้
      ในภาพกว้างกว่านั้น ก็อยากฟังความคิดว่าควรทำให้เกมชัดเจนขึ้นได้อย่างไร
      รู้ว่าคู่มืออธิบายคำสั่งคงช่วยได้ แต่ยินดีรับไอเดียอื่นๆ ด้วย
  • เป็นbrutalist UI/UX ที่งดงาม

  • ก่อนลองเล่น ผมกด “About” แล้วมีหน้าใหม่เปิดขึ้นมาพร้อมข้อความแบบนี้: “การใช้ไซต์นี้ต่อไปถือว่าคุณยินยอมให้ใช้คุกกี้”
    ดูเหมือนละเมิด GDPR การปฏิเสธคุกกี้ควรทำได้ง่ายพอๆ กับการยินยอม
    โดยเฉพาะคุกกี้พวกนี้ก็ดูไม่จำเป็นต่อการทำงานของไซต์ด้วย
    “บริการใช้คุกกี้และเทคโนโลยีที่คล้ายกัน เช่น pixel tags, web beacons, clear GIFs และ JavaScript เพื่อให้เซิร์ฟเวอร์รู้จักเว็บเบราว์เซอร์ของคุณ ทราบเวลาเข้าชมและใช้งาน วิเคราะห์แนวโน้ม ทำความเข้าใจฐานผู้ใช้ และดำเนินงานรวมถึงปรับปรุงบริการ … เราอาจเสริมข้อมูลที่เก็บรวบรวมด้วยข้อมูลที่ได้รับจากบุคคลที่สาม รวมถึงคุกกี้ที่บุคคลที่สามวางไว้บนอุปกรณ์ของคุณ”
    https://ofrak.com/privacy/#tracking-tools-and-opt-out
    การบอกให้ลบคุกกี้ด้วยการตั้งค่าเบราว์เซอร์ที่ด้านล่างของหน้าไม่ใช่วิธีแก้ที่ยอมรับได้

    • น่าเสียดายที่พฤติกรรมแบบนี้เกิดขึ้นในหลายเว็บไซต์ และหลายบริษัทก็ไม่ได้ปฏิบัติตามกฎหมายคุกกี้อย่างถูกต้อง
      https://www.cnil.fr/en/refusing-cookies-should-be-easy-accep...
    • ฝั่งผมไม่ได้เก็บอะไรผิดกฎหมายไว้เลย มีแค่การตั้งค่าเกม ไม่รู้เหมือนกันว่าทำไมแบนเนอร์นั้นถึงขึ้น
    • วิธีบอกผู้เยี่ยมชมไซต์ให้ปิดคุกกี้ในเบราว์เซอร์นั้น apple.com ก็ใช้เหมือนกันเป๊ะ
  • สงสัยว่า build เกมนี้ยังไง
    ลองดู https://ofrak.com/docs/environment-setup.html แล้ว แต่ไม่เจอรายละเอียดเฉพาะของเกม Tetris
    อาจเป็นผมที่พลาดไปก็ได้

  • ชอบคอนเซปต์นี้มาก
    หัวใจของการทำคะแนนสูงดูเหมือนจะเป็นการเขียน 0 ลงใน PC
    เพราะ binary code ของคำสั่งใหม่จะถูก “เพิ่ม” เข้าไปในพื้นที่หน่วยความจำที่เห็นทางขวา จากนั้นก็สามารถจัดการ R12 เพื่อทำคะแนนให้สูงสุดได้

    • อีกหัวใจหนึ่งคือเปลี่ยน R12 ให้เป็นค่าที่หารด้วย 4 ไม่ลงตัว
      เพราะคำสั่งทั้งหมดมีขนาด 4 byte และบิตบนสุดเป็น 1 เสมอ
      บางครั้งขึ้นไปได้ถึงประมาณ 2 พันล้าน แต่ค่าเฉลี่ยค่อนข้างต่ำ ;)