Naveen Sastry

11 papers A* 5B 1Misc 1Journal 1Unranked 3
YearRankTypeTitle / Venue / Authors
2008 A* conf
CCS
Matthew Finifter, Adrian Mettler, Naveen Sastry, David A. Wagner
2006 A* conf
USENIX Security Symposium
Naveen Sastry
2006 J jnl
IACR Cryptol. ePrint Arch.
David Molnar, Tadayoshi Kohno, Naveen Sastry, David A. Wagner
2006 conf
S&P
David Molnar, Tadayoshi Kohno, Naveen Sastry, David A. Wagner
2005 A* conf
USENIX Security Symposium
Chris Karlof, Naveen Sastry, David A. Wagner
2005 B conf
EWSN
Cory Sharp, Shawn Schaffert, Alec Woo, Naveen Sastry, Chris Karlof, Shankar Sastry, David E. Culler
2004 A* conf
NDSS
Chris Karlof, Naveen Sastry, Yaping Li, Adrian Perrig, J. D. Tygar
2004 conf
Workshop on Wireless Security
Naveen Sastry, David A. Wagner
2004 Misc conf
SenSys
Chris Karlof, Naveen Sastry, David A. Wagner
2003 A* conf
USENIX Security Symposium
Peter Broadwell, Matthew Harren, Naveen Sastry
2003 conf
Workshop on Wireless Security
Naveen Sastry, Umesh Shankar, David A. Wagner
redb/extractors/decompiler/bninja/analysis/strings.py
← Index redb/extractors/decompiler/bninja/analysis/strings.py python
from collections import Counter
import math

class StringAnalysis:
    def __init__(self, bv, functions):
        self.bv = bv
        self.functions = functions

    def entropy(self, s: str) -> float:
        """Compute Shannon entropy of a string."""
        if not s:
            return 0.0
        freq = Counter(s)
        length = len(s)
        return -sum((count / length) * math.log2(count / length) for count in freq.values())

    def analyze(self):
        """
        Extract unique strings from the binary.

        Deduplicates by (string, encoding) within the same binary, keeping the
        first occurrence (lowest offset). Cross-binary deduplication and
        aggregation is handled by ClickHouse materialized views.
        """
        strings = {}

        # Sort strings by their starting address
        sorted_entries = sorted(self.bv.strings, key=lambda e: e.start)

        for entry in sorted_entries:
            # Key is the string and its encoding
            key = (entry.value, entry.type.name)

            # Skip if this string (value + encoding) was already added.
            # Because entries are sorted by address, the first one is always kept.
            if key in strings:
                continue

            # Store only the first occurrence with schema-matching field names
            # entry.length is the raw byte length, len(entry.value) is decoded string length
            string_entry = {
                "string": entry.value,
                "string_raw": entry.raw,
                "string_encoding": entry.type.name,
                "string_offset": entry.start,
                "string_length": len(entry.value),
                "string_raw_length": entry.length,
                "string_entropy": self.entropy(entry.value),
            }

            strings[key] = string_entry

        # Return as list for export compatibility
        return list(strings.values())