From b4ec9031cbf7d1c05893cc09ea298903dc6b0cd8 Mon Sep 17 00:00:00 2001 From: Dobin Date: Sat, 17 Feb 2024 13:34:39 +0000 Subject: [PATCH] ui: better website --- app/templates/project.html | 6 +-- app/views.py | 83 ++++++++++++++++++++++---------------- helper.py | 31 +++++++++++++- observer.py | 22 +++++----- r2helper.py | 35 ++++++++++++++++ requirements.txt | 3 +- 6 files changed, 130 insertions(+), 50 deletions(-) create mode 100644 r2helper.py diff --git a/app/templates/project.html b/app/templates/project.html index 18cfeeb..630443f 100644 --- a/app/templates/project.html +++ b/app/templates/project.html @@ -10,7 +10,7 @@
-
+
-
+
{% for log_file in log_files %}
- {{log_file['content']|safe}} +
{{log_file['content']|safe}}
{% endfor %}
diff --git a/app/views.py b/app/views.py index 8b2d394..feee411 100644 --- a/app/views.py +++ b/app/views.py @@ -6,12 +6,16 @@ import io from typing import List, Tuple from datetime import date from pygments import highlight -from pygments.lexers import CLexer, NasmLexer, DiffLexer +from pygments.lexers import CLexer, NasmLexer, DiffLexer, HexdumpLexer from pygments.formatters import HtmlFormatter import difflib +from ansi2html import Ansi2HTMLConverter + views = Blueprint('views', __name__) +conv = Ansi2HTMLConverter() + @views.route("/") def index(): @@ -27,49 +31,60 @@ def project(): asm_a = "" # for diff asm_b = "" for file in os.listdir("logs"): - if file.endswith(".txt"): - print("Handle: ", file) + print("Handle: ", file) - with open(os.path.join("logs", file), "r") as f: - data = f.read() + with open(os.path.join("logs", file), "r") as f: + data = f.read() - if 'main_c' in file: - data = highlight(data, CLexer(), HtmlFormatter(full=False)) - elif '_asm' in file: - # handle special cases - if '_orig' in file: - asm_a = data - if '_cleanup' in file: - asm_b = data + if 'main_c' in file: + data = highlight(data, CLexer(), HtmlFormatter(full=False)) + elif 'payload_asm' in file: + # handle special cases + if '_orig' in file: + asm_a = data + if '_cleanup' in file: + asm_b = data + data = highlight(data, NasmLexer(), HtmlFormatter(full=False)) + elif 'shc_from_asm' in file: + if '.txt' in file: + # skip it + continue + if '.ascii' in file: + #data = data.replace(" ", " ") + data = conv.convert(data, full=False) + #data = data.replace("\n", "
") + if '.hex' in file: + #data = highlight(data, HexdumpLexer(), HtmlFormatter(full=False)) + #data = data.replace("\n", "
") + #data = data.replace(" ", " ") + data = data - data = highlight(data, NasmLexer(), HtmlFormatter(full=False)) + entry = { + "name": file, + "id": str(id), + "content": data, + } + log_files.append(entry) + id += 1 + # more + if asm_a != "" and asm_b != "": + # do the diff from the content of the two files + a = asm_a.splitlines() + b = asm_b.splitlines() + diff_generator = difflib.unified_diff(a, b, lineterm='') + diff_string = '\n'.join(diff_generator) + diff_l = highlight(diff_string, DiffLexer(), HtmlFormatter(full=False)) entry = { - "name": file, + "name": "_asm_diff".format(), "id": str(id), - "content": data, + "content": diff_l, } log_files.append(entry) id += 1 - - # more - if asm_a != "" and asm_b != "": - # do the diff from the content of the two files - a = asm_a.splitlines() - b = asm_b.splitlines() - diff_generator = difflib.unified_diff(a, b, lineterm='') - diff_string = '\n'.join(diff_generator) - diff_l = highlight(diff_string, DiffLexer(), HtmlFormatter(full=False)) - entry = { - "name": "_asm_diff".format(), - "id": str(id), - "content": diff_l, - } - log_files.append(entry) - id += 1 - asm_a = "" - asm_b = "" + asm_a = "" + asm_b = "" return render_template('project.html', diff --git a/helper.py b/helper.py index 163074b..3e5fa00 100644 --- a/helper.py +++ b/helper.py @@ -100,4 +100,33 @@ def rbrunmode_str(rbrunmode): elif rbrunmode == "3": return "setup TLS callback" else: - return "Invalid" \ No newline at end of file + return "Invalid" + + +def hexdump(data, addr = 0, num = 0): + s = '' + n = 0 + lines = [] + if num == 0: num = len(data) + + if len(data) == 0: + return '' + + for i in range(0, num, 16): + line = '' + line += '%04x | ' % (addr + i) + n += 16 + + for j in range(n-16, n): + if j >= len(data): break + line += '%02x ' % (data[j] & 0xff) + + line += ' ' * (3 * 16 + 7 - len(line)) + ' | ' + + for j in range(n-16, n): + if j >= len(data): break + c = data[j] if not (data[j] < 0x20 or data[j] > 0x7e) else '.' + line += '%c' % c + + lines.append(line) + return '\n'.join(lines) \ No newline at end of file diff --git a/observer.py b/observer.py index 5d2a244..c1a648f 100644 --- a/observer.py +++ b/observer.py @@ -3,6 +3,7 @@ import pprint from capstone import Cs, CS_ARCH_X86, CS_MODE_64 from model import * +from r2helper import r2_disas class Observer(): @@ -11,24 +12,23 @@ class Observer(): self.idx = 0 def add_text(self, name, data): - self.write_to_file(name, data) + self.write_to_file(name + ".txt", data) + self.idx += 1 - def add_code(self, name, data): - md = Cs(CS_ARCH_X86, CS_MODE_64) - - # Disassemble the shellcode - ret = "" - for i in md.disasm(data, 0x0): - ret += "0x%x:\t%s\t%s\n" % (i.address, i.mnemonic, i.op_str) - self.write_to_file(name, ret) + def add_code(self, name, data: bytes): + ret = r2_disas(data) + self.write_to_file(name + ".disas.txt", ret['text']) + self.write_to_file(name + ".disas.ascii", ret['color']) + self.write_to_file(name + ".hex", ret['hexdump']) + self.idx += 1 def add_json(self, name, data): self.write_to_file(name, pprint.pformat(data, indent=4)) + self.idx += 1 def write_to_file(self, filename, data): - with open("logs/{}-{}.txt".format(self.idx, filename), "w") as f: + with open("logs/{}-{}".format(self.idx, filename), "w") as f: f.write(data) - self.idx += 1 def __str__(self): s = "" diff --git a/r2helper.py b/r2helper.py new file mode 100644 index 0000000..c088b9f --- /dev/null +++ b/r2helper.py @@ -0,0 +1,35 @@ +import r2pipe +import os + +from defs import * +from helper import hexdump + +def r2_disas(data: bytes): + filename = "r2_data.bin" + ret = { + 'text': None, + 'color': None, + 'hexdump': None, + } + + ret["hexdump"] = hexdump(data) + + # fucking r2 cant handle shellcode when not in files... + with open(filename, "wb") as f: + f.write(data) + + r2 = r2pipe.open(filename) + r2.cmd('aaa') + + r2.cmd('e scr.color=0') + ret['text'] = r2.cmd('pd') + ret['text'] = '\n'.join(ret['text'].splitlines()) # fix newlines + + r2.cmd('e scr.color=2') + ret['color'] = r2.cmd('pd') + ret['color'] = '\n'.join(ret['color'].splitlines()) # fix newlines + + r2.quit() + os.remove(filename) + + return ret \ No newline at end of file diff --git a/requirements.txt b/requirements.txt index 0aa1b5f..1be08ef 100644 --- a/requirements.txt +++ b/requirements.txt @@ -3,4 +3,5 @@ pefile capstone keystone-engine jinja2 -Pygments \ No newline at end of file +Pygments +ansi2html \ No newline at end of file