File size: 2,284 Bytes
70ebd4a
66f8fc1
20b2b87
b4c7402
 
 
e98177c
 
 
 
 
 
 
 
20b2b87
b4c7402
 
 
 
e98177c
b4c7402
 
 
e98177c
b4c7402
029945b
 
 
 
 
 
e98177c
 
 
 
 
 
 
 
 
 
 
 
 
 
 
36c1bbc
e98177c
b4c7402
 
e98177c
20b2b87
029945b
20b2b87
029945b
66f8fc1
 
329f9c0
 
 
e98177c
41e9ae6
0d4ef9d
fa2e9f5
20f12de
 
41e9ae6
029945b
 
 
 
 
329f9c0
66f8fc1
329f9c0
720784d
e98177c
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
from hexdump2 import hexdump
import gradio as gr
import shlex
import subprocess
import tempfile

description = """This is a space testing a method for evaluating the quality of decompilation.

Currently unhandled features:
* Global references
* Function calls
"""


def compile(compiler, flags, source):
    # Create a temporary file for the C source code
    with tempfile.NamedTemporaryFile(suffix=".c", delete=False) as temp_c_file:
        temp_c_file.write(source.encode())
        temp_c_file_name = temp_c_file.name

    # Create a temporary file for the object file
    with tempfile.NamedTemporaryFile(suffix=".o", delete=False) as temp_o_file:
        temp_o_file_name = temp_o_file.name

    # Compile the C file to an object file
    subprocess.run(
        [compiler, "-c", temp_c_file_name]
        + shlex.split(flags)
        + ["-o", temp_o_file_name],
        check=True,
    )

    # Create a temporary file for the raw bytes
    with tempfile.NamedTemporaryFile(suffix=".raw", delete=True) as raw_bytes_file:
        subprocess.run(
            [
                "objcopy",
                "--only-section",
                ".text",
                "-O",
                "binary",
                temp_o_file_name,
                raw_bytes_file.name,
            ]
        )
        compiled_bytes = raw_bytes_file.read()
        print(compiled_bytes)

    return compiled_bytes


def predict(target, source, compiler, flags):
    target = bytes.fromhex(target)
    bytes = compile(compiler, flags, source)
    return hexdump(bytes, result="return"), hexdump(target, result="return"), 1.0


def run():
    demo = gr.Interface(
        fn=predict,
        description=description,
        inputs=[
            gr.Textbox(lines=10, label="Bytes of Target Function (in hex)", value="61 62 63"),
            gr.Textbox(lines=10, label="Decompiled C Source Code", value="int foo() { return 42; }"),
            gr.Textbox(label="Compiler", value="gcc"),
            gr.Textbox(label="Compiler Flags", value="-O2"),
        ],
        outputs=[
            gr.Textbox(label="Compiled bytes"),
            gr.Textbox(label="Target bytes"),
            gr.Number(label="Accuracy (TBD)"),
        ],
    )

    demo.launch(server_name="0.0.0.0", server_port=7860)


run()