Skip to content

Instantly share code, notes, and snippets.

@5unkn0wn
Last active January 22, 2026 12:00
Show Gist options
  • Select an option

  • Save 5unkn0wn/24fa0148aca34709a41239629c514986 to your computer and use it in GitHub Desktop.

Select an option

Save 5unkn0wn/24fa0148aca34709a41239629c514986 to your computer and use it in GitHub Desktop.
# https://github.com/codedefender-io/sigbreaker/blob/b58f8e0f7525ba204832a3d077c9584c6cdf8fc1/crackme/crackme.obfuscated.exe
import sys
import struct
import binascii
def _doublesipround(v, m):
a, b, c, d = v
d ^= m
e = (a + b) & 0xffffffffffffffff
i = (((b & 0x7ffffffffffff) << 13) | (b >> 51)) ^ e
f = c + d
j = ((((d) << 16) | (d >> 48)) ^ f ) & 0xffffffffffffffff
h = (f + i) & 0xffffffffffffffff
k = ((e << 32) | (e >> 32)) + j
l = (((i & 0x7fffffffffff) << 17) | (i >> 47)) ^ h
o = (((j << 21) | (j >> 43)) ^ k) & 0xffffffffffffffff
p = (k + l) & 0xffffffffffffffff
q = (((l & 0x7ffffffffffff) << 13) | (l >> 51)) ^ p
r = ((h << 32) | (h >> 32)) + o
s = (((o << 16) | (o >> 48)) ^ r) & 0xffffffffffffffff
t = (r + q) & 0xffffffffffffffff
u = (((p << 32) | (p >> 32)) + s) & 0xffffffffffffffff
return (u ^ m,
(((q & 0x7fffffffffff) << 17) | (q >> 47)) ^ t,
((t & 0xffffffff) << 32) | (t >> 32),
(((s & 0x7ffffffffff) << 21) | (s >> 43)) ^ u)
_zeroes = b'\x00\x00\x00\x00\x00\x00\x00\x00'
_oneQ = struct.Struct('<Q')
_twoQ = struct.Struct('<QQ')
class SipHash_2_4(object):
digest_size = 16
block_size = 64
s = b''
b = 0
def __init__(self, secret, s=b''):
k0, k1 = _twoQ.unpack(secret)
# self.v = (0x31161a3d03d32f00,
# 0x4eb336dfabceb4ab,
# 0x2e00103d1dc53814,
# 0x5eb920dcbcdebe5b)
self.v = (0x736f6d6570736575 ^ k0,
0x646f72616e646f6d ^ k1,
0x6c7967656e657261 ^ k0,
0x746564627974659d ^ k1) # modified: 0x7465646279746573 -> 0x746564627974659d
self.update(s)
def update(self, s):
s = self.s + s
lim = (len(s)//8)*8
v = self.v
off = 0
for off in range(0, lim, 8):
m, = _oneQ.unpack_from(s, off)
v = _doublesipround(v, m)
self.v = v
self.b += lim
self.s = s[lim:]
return self
def hash(self):
l = len(self.s)
assert l < 8
b = (((self.b + l) & 0xff) << 56)
b |= _oneQ.unpack_from(self.s+_zeroes)[0]
v = self.v
v = _doublesipround(v, b)
v = list(v)
v[2] ^= 0xee # modified: 0xff -> 0xee
v = _doublesipround(_doublesipround(v, 0), 0)
return v[0] ^ v[1] ^ v[2] ^ v[3]
def digest(self):
return _oneQ.pack(self.hash())
def hexdigest(self):
return binascii.hexlify(self.digest())
if __name__ == "__main__":
if len(sys.argv) < 2:
print("Missing commandline flag!")
exit()
key = b'uJ\xa0sXwyB\xc6\xdb\xaa\xc5\xbeD\xdc*'
if SipHash_2_4(key, sys.argv[1].encode()).hexdigest() == 'b71fcdb17b678a3f':
print("Success")
else:
print("Failure")
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment