GithubHelp home page GithubHelp logo

fuzzinglabs / thoth Goto Github PK

View Code? Open in Web Editor NEW
240.0 4.0 21.0 5.75 MB

Cairo/Starknet security toolkit (bytecode analyzer, disassembler, decompiler, symbolic execution, SBMC)

Home Page: https://fuzzinglabs.com/

License: GNU Affero General Public License v3.0

Python 63.27% Cairo 32.61% TypeScript 3.69% Rust 0.42%
analysis cairo-lang callflow cfg disassembler reversing security starknet decompiler sierra symbolic-execution

thoth's Issues

support indirect call

In some cases, we can have indirect calls

image

It's not supported yet.

on the current codebase we need to add:

  • proper disassembly print i.e. call abs [fp + 4], call rel [fp + 4]
  • add indirect call info inside the callgraph (dashed circle?)

big_struct

We don't have the disassembling of the objects (struct) and their attributes (members):
big_struct_disass
while we have:
big_struct
big_struct_json

print of APUpdate

APUpdate should be shown only after an ASSERT_EQ.
Bug is fixed on the decompiler, need to fix it also in the disassembler.

Decorators

We don't have the decorators disassembling.
For those codes (decorators1.cairo decorators2.cairo decorators3.cairo and constructor.cairo, l1_default.cairo):
decorators1
decorators2
decorators3
constructor1
l1_default

And those bytecodes:

(decorators1.json)
storage_var:
read
write

view:
view

external:
external
or
externals

(decorators2.json)
raw_input and raw_output:
raw_input

(decorators3.json)
event:
event

(constructor.json)
constructor:
constructor
or
constructor2

(l1_default.json)
l1_handler:
l1_handler
l1_handler_json

[CFG] print in textual form

we need to find a way to print the CFG like the disassembly output

ideally something like radare2 will be nice

image

APupdate - if/else

in this example
image

We assign :

[AP] = 0

And we update ap.
So in the if statement, the AP used is not the same as the assigned before.
What should we do in this case ?

CAIRO SOURCE CODE :

image

[DISAS] flag color

add a flag to print disassembly with color :
builtins/struct
function name
call and return
jump

[CALL] [DISAS] extract and show event info

The information that a function is an event can be found inside the abi section
for file: starknet_decorators3.json

image

we need to extract it, print it in the disassembler and the callgraph

Implicit Arguments

We don't have the disassembling of functions implicit arguments;
For this code: cairo_implicit_parameters.cairo
builtins_in_functions
And this bytecode: cairo_implicit_parameters.json
buitlins_in_functions_json
We have:
builtins_in_functions_disass

remove dep to cairo-lang

the only place we need to import from cairo-lang library is for the decode_instruction

Could be interesting to copy decode_instruction and the Instruction directly in this program to prevent cairo-lang dependency and potential issue if people are not using venv

imports with parentheses

python3 __main__.py -file tests/json_files/starknet_imports_with_parentheses.json

Traceback (most recent call last):
File "main.py", line 69, in
main()
File "main.py", line 50, in main
disassembler = Disassembler(args.file)
File "/home/fuzz/cairo_disassembler/disassembler.py", line 24, in init
self.analyze()
File "/home/fuzz/cairo_disassembler/disassembler.py", line 31, in analyze
self.json = parseToJson(self.file)
File "/home/fuzz/cairo_disassembler/jsonParser.py", line 126, in parseToJson
data, func_offset, func_identifiers = extractData(path)
File "/home/fuzz/cairo_disassembler/jsonParser.py", line 82, in extractData
json_data = json.load(f)
File "/usr/lib/python3.8/json/init.py", line 293, in load
return loads(fp.read(),
File "/usr/lib/python3.8/json/init.py", line 357, in loads
return _default_decoder.decode(s)
File "/usr/lib/python3.8/json/decoder.py", line 337, in decode
obj, end = self.raw_decode(s, idx=_w(s, 0).end())
File "/usr/lib/python3.8/json/decoder.py", line 353, in raw_decode
obj, end = self.scan_once(s, idx)
json.decoder.JSONDecodeError: Invalid control character at: line 84067 column 109 (char 4194304)

[CFG] [DISAS] implement label in disassembly & cfg

we can find all label by looking at relative jump offset (JUMP_REL 9) and relative CALL (CALL rel 3145)

once done we should have an output like:

offset 2458:  ADD            AP, 1          
offset 2459:  ASSERT_EQ      [AP], [FP]     
offset 2459:  ADD            AP, 1          
offset 2460:  CALL           rel 4870       
offset 2460:  ADD            AP, 2          

label_2462:

offset 2462:  ASSERT_EQ      [AP], [FP-4] + [FP]
offset 2462:  ADD            AP, 1          
offset 2463:  ASSERT_EQ      [FP-3], [[AP-1]]
offset 2464:  ASSERT_EQ      [AP], [FP] + 1 
offset 2464:  ADD            AP, 1          
offset 2466:  ASSERT_EQ      [AP], [FP] + 1 
offset 2466:  ADD            AP, 1          
offset 2468:  ASSERT_EQ      [AP], [AP-4]   
offset 2468:  ADD            AP, 1          

CALL ABS/REL

Disassembler does not make a difference between CALL ABS and CALL REL
image
image

I fixed the bug for the decompiler, just need to do the same for the disassembler

get_code

We can not detect the start/end of a function

[DISAS] add support for references

Some identifiers (with type = "reference") actually contains value that we can print as comment during disassembly

(warning: I'm not speaking about the "reference manager" section)

image

image

Python Package

The project should be allow the user to install it as a python package

Format of the implicit argument disass

We have:
python3 __main__.py -file tests/json_files/cairo_implicit_parameters.json
image
But the format of the implicit argument is using brackets { } and the classic arguments are using ( ):
cairo_implicit_parameters.cairo
image

[DISAS] handle more properly contract interface

in this test: tests/json_files/starknet_contract_interface.json

there is no bytecode because it's a contract interface.
For the moment we just quit and inform the user but we should do something else ;)

image

Dissa

When we try to get the callflowgraph of the cairo_direct_recursion.json we don't have the direct recursion.
Command:
python3 __main__.py -file tests/json_files/cairo_direct_recursion.json -call
direct_recursion_cfg_fail
Result:
cfg

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    ๐Ÿ–– Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. ๐Ÿ“Š๐Ÿ“ˆ๐ŸŽ‰

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google โค๏ธ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.