มาลองแกะ code Oyente กันเถอะ (Part 1 Constructing basic block)
untangling things can be kinda fun
Oyente เป็น smart contract analysis tool ตัวแรกๆ โดย publish ใน paper making smart contracts smarter และหลังจากนั้นก็มีการพัฒนาเพิ่มมาเรื่อยๆ
โดย Oyente จะใช้การป้อน cfg เข้าไปใน symbolic executor เพื่อ detect bug
แต่เราจะไม่อ่าน paper อย่างเดียว มาลองแกะ code oyente ใน version ที่ตรงกับ paper กันเถอะ
การ setup
clone git
แก้ Dockerfile
docker build -t oyente . && docker run -it oyente:latest
Experiment
โอเค input ที่จะใช้คือ
โอเค ก่อนอื่น solidity file จะถูก disassembly
ได้เป็น opcode
จากนั้นป้อน opcode ไปสร้าง cfg และ ทำการ symbolic execution
โดย cfg ที่ถูกสร้างขึ้น จะใช้ดู path ต่างๆในการ execute program
ใน cfg จะประกอบด้วย 2 ส่วนคือ node และ เส้น
โดย code ที่อยู่ใน node เดียวกัน จะถูก execute ด้วยกัน
และเมื่อต้องเลือกเส้นไปยัง node ถัดไป จะเลือกได้เพียงเส้นเดียวเท่านั้น
โดยเราเรียกรูปแบบในการจัด node นี้ว่า basic block
โดยในแต่ละ basic block เราจะเก็บ instruction และรูปแบบการ jump ไปยัง block ถัดไป
เช่น
unconditional จะเป็น block ที่มีเส้นถัดไปเส้นเดียว
conditional จะเป็น block ที่มีเส้นถัดไปหลายเส้น
terminal จะเป็น block ที่ไม่มีเส้นถัดไป
โอเค ประมาณนี้ก่อน ไว้เรามาดูการเชื่อมแต่ละ basic block เป็น cfg กันต่อ
Referrences
https://eprint.iacr.org/2016/633.pdf
https://www2.cs.arizona.edu/~collberg/Teaching/453/2009/Handouts/Handout-15.pdf