> For the complete documentation index, see [llms.txt](https://kos0ng.gitbook.io/ctfs/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://kos0ng.gitbook.io/ctfs/write-up/2024/codegate-ctf-preliminary/reverse-engineering.md).

# Reverse Engineering

<table><thead><tr><th width="347">Challenge</th><th>Link</th></tr></thead><tbody><tr><td>Everlasting_Message (250 pts)</td><td><a href="#everlasting_message-250-pts">Here</a></td></tr><tr><td>prism_messenger (358 pts)</td><td><a href="#prism_messenger-358-pts">Here</a></td></tr><tr><td>LACUCARA_VM (805 pts)</td><td><a href="#lacucara_vm-805-pts">Here</a></td></tr></tbody></table>

## Everlasting\_Message (250 pts)

### Description

\-

### Solution

TBU

## prism\_messenger (358 pts)

### Description

\-

### Solution

TBU

## LACUCARA\_VM (805 pts)

### Description

\-

### Solution

```python

def print_hex(arr):
	tmp = []
	for i in arr:
		tmp.append(hex(i))
	print(tmp)

rol = lambda val, r_bits, max_bits: \
    (val << r_bits%max_bits) & (2**max_bits-1) | \
    ((val & (2**max_bits-1)) >> (max_bits-(r_bits%max_bits)))
 
ror = lambda val, r_bits, max_bits: \
    ((val & (2**max_bits-1)) >> r_bits%max_bits) | \
    (val << (max_bits-(r_bits%max_bits)) & (2**max_bits-1))

mask = 2**32 -1

# key = [0x0b07bbe1, 0x0407edb8]
key = [0x7F78E2E4, 0xD219BB1F]
# inp = [0x38396162, 0x63646566]
inp = [0x4b4f534f, 0x4e47424c]
sbox1 = [0x43415241, 0x4c414355]
# inp = [0x30313233, 0x34353637]

print_hex(inp)

tmp1 = []
for i in range(len(key)):
	tmp1.append(key[i] ^ sbox1[i] ^ inp[i])

dict1 = {}
dict1[0x9] = 0xc
dict1[0x8] = 0xf
dict1[0xd] = 0x0
dict1[0x8] = 0xf
dict1[0xb] = 0xa
dict1[0xa] = 0x9
dict1[0x3] = 0x1
dict1[0x7] = 0xd
dict1[0xc] = 0x3
dict1[0x2] = 0x2
dict1[0xf] = 0x6
dict1[0x0] = 0x4
dict1[0x6] = 0xe
dict1[0x5] = 0xb
dict1[0x1] = 0x7
dict1[0xe] = 0x5
dict1[0x4] = 0x8

dict2 = {}
dict2[0xc] = 0x9
dict2[0xf] = 0x8
dict2[0x0] = 0xd
dict2[0xf] = 0x8
dict2[0xa] = 0xb
dict2[0x9] = 0xa
dict2[0x1] = 0x3
dict2[0xd] = 0x7
dict2[0x3] = 0xc
dict2[0x2] = 0x2
dict2[0x6] = 0xf
dict2[0x4] = 0x0
dict2[0xe] = 0x6
dict2[0xb] = 0x5
dict2[0x7] = 0x1
dict2[0x5] = 0xe
dict2[0x8] = 0x4

xor_val1 = [0x3707344, 0x299f31d0, 0xec4e6c89, 0x38d01377, 0x34e90c6c, 0]
xor_val2 = [0x13198a2e, 0xa4093822, 0x82efa98, 0x452821e6, 0xbe5466cf, 0]

for y in range(5):
	
	# print_hex(tmp1)
	result1 = 0
	for i in range(8):
		tmp2 = (tmp1[1] >> (4 * i)) | ((tmp1[0] << (32 - 4 * i)) & mask)
		index = tmp2 & 0xf
		result1 |= (dict1[index] << (4 * i))

	result2 = 0
	for i in range(8):
		tmp2 = tmp1[0] >> (i * 4)
		index = tmp2 & 0xf
		result2 |= (dict1[index] << (4 * i))
	
	# print("input", hex(result1), hex(result2))
	first_block = [result2 >> 0x10, ((result1 << 0x10) & mask) >> 0x10]
	second_block = [((result2 << 0x10) & mask) >> 0x10, result1 >> 0x10]
	arr2 = []
	for x in range(2):
		tmp2 = first_block[x]
		arr1 = [0]
		for i in range(1, 0x10):
			arr1.append(tmp2 >> i)
		
		result3 = tmp2
		
		var1 = arr1[0x8] ^ arr1[0xc]
		var2 = arr1[0xb] ^ arr1[0xf]
		var3 = arr1[0x7] ^ arr1[0xb]
		var4 = arr1[0x4] ^ arr1[0x8]
		var5 = arr1[0xa] ^ arr1[0xe]
		
		result3 ^= var4
		
		var6 = arr1[0x6] ^ arr1[0xe]
		var7 = arr1[0x3] ^ var3
		var8 = arr1[0x2] ^ var6
		var9 = arr1[0x9] ^ arr1[0xd]
		var10 = arr1[0x1] ^ var9
		var11 = arr1[0x4] ^ var1
		var12 = arr1[0x7] ^ var2
		var13 = arr1[0x2] ^ arr1[0x6]
		var14 = var13 ^ arr1[0xa]
		var15 = var1 ^ tmp2
		var16 = arr1[0xd] ^ arr1[0x1]
		var17 = arr1[0x5] ^ var16
		var18 = var2 ^ arr1[0x3]
		var19 = var5 ^ arr1[0x6]
		var20 = arr1[0x1] ^ arr1[0x9] ^ arr1[0x5]
		var21 = arr1[0x4] ^ arr1[0xc] ^ tmp2
		var22 = arr1[0x3] ^ arr1[0x7] ^ arr1[0xf]
		var23 = var5 ^ arr1[0x2]
		var24 = arr1[0x5] ^ var9
		
		
		result4 = (result3 & 0x1)
		result4 |= (var7 << 0xf) 
		result4 |= (var8 << 0xe) & 0x4000
		result4 |= (var10 << 0xd) & 0x2000
		result4 |= (var11 << 0xc) & 0x1000
		result4 |= (var12 << 0xb) & 0x800
		result4 |= (var14 << 0xa) & 0x400
		result4 |= (var17 << 0x9) & 0x200
		result4 |= (var15 << 0x8) & 0x100
		result4 |= (var18 << 0x7) & 0xff
		result4 |= (var19 << 0x6) & 0x40
		result4 |= (var20 << 0x5) & 0x20
		result4 |= (var21 << 0x4) & 0x10
		result4 |= (var22 << 0x3) & 0x8
		result4 |= (var23 << 0x2) & 0x4
		result4 |= (var24 << 0x1) & 0x2
		
		result5 = ((result4 << 0x10) & mask) >> 0x10
		# print(hex(result4))
		
	
		tmp2 = second_block[x]
		arr1 = [0]
		# print("pt", hex(tmp2))
		for i in range(1, 0x10):
			arr1.append(tmp2 >> i)
		
		var1 = arr1[0x8] ^ arr1[0xc]
		var2 = arr1[0xb] ^ arr1[0xf]
		var3 = arr1[0xe] ^ arr1[0xa]
		var4 = arr1[0x7] ^ var2
		var5 = arr1[0x4] ^ var1
		var6 = arr1[0x6] ^ arr1[0xa]
		var7 = var6 ^ arr1[0x2]
		var8 = arr1[0x9] ^ arr1[0xd]
		var9 = arr1[0x5] ^ arr1[0xd]
		var10 = var9 ^ arr1[0x1]
		var11 = tmp2 ^ var1
		var12 = arr1[0x3] ^ var2
		var13 = var3 ^ arr1[0x6]
		var14 = arr1[0x1] ^ arr1[0x5]
		var15 = var14 ^ arr1[0x9]
		var16 = arr1[0x4] ^ arr1[0xc]
		var17 = var16 ^ tmp2
		var18 = arr1[0x7] ^ arr1[0xf]
		var19 = var18 ^ arr1[0x3]
		var20 = var3 ^ arr1[0x2]
		var21 = var8 ^ arr1[0x5]
		var22 = arr1[0x4] ^ arr1[0x8]
		var23 = var22 ^ tmp2
		var24 = arr1[0x7] ^ arr1[0xb]
		var25 = var24 ^ arr1[0x3]
		var26 = arr1[0x2] ^ arr1[0x6]
		var27 = var26 ^ arr1[0xe]
		var28 = var8 ^ arr1[0x1]
		
		result4 = (var5 & 0x1)
		result4 |= (var4 << 0xf) 
		result4 |= (var7 << 0xe) & 0x4000
		result4 |= (var10 << 0xd) & 0x2000
		result4 |= (var11 << 0xc) & 0x1000
		result4 |= (var12 << 0xb) & 0x800
		result4 |= (var13 << 0xa) & 0x400
		result4 |= (var15 << 0x9) & 0x200
		result4 |= (var17 << 0x8) & 0x100
		result4 |= (var19 << 0x7) & 0xff
		result4 |= (var20 << 0x6) & 0x40
		result4 |= (var21 << 0x5) & 0x20
		result4 |= (var23 << 0x4) & 0x10
		result4 |= (var25 << 0x3) & 0x8
		result4 |= (var27 << 0x2) & 0x4
		result4 |= (var28 << 0x1) & 0x2
		
		result6 = ((result4 << 0x10) & mask) >> 0x10
		arr2.append(result5)
		arr2.append(result6)
	
	ct1 = (arr2[3] << 0x10) | arr2[2]
	ct2 = (arr2[0] << 0x10) | arr2[1]
	
	var1 = ct2 >> 0x1c
	var2 = (var1 << 0x14) & mask
	var3 = ct2 >> 0x18
	var4 = var3 & 0xf
	var5 = ct2 >> 0x4
	var6 = (var5 << 0x1c) & mask
	var7 = var6 | var2
	
	var8 = (ct1 << 0x8) & mask
	var9 = var8 & 0xf00
	var10 = var7 | var9
	
	var11 = ct2 >> 0x8
	var12 = var11 & 0xf000
	var13 = var4 | var12
	
	var14 = (ct2 << 0x8) & mask
	var15 = var14 & 0xf000000
	var16 = var15 | var13
	
	var17 = var10 | ((ct2 >> 0x8) & 0xf0)
	var18 = var17 | (((ct2 << 0x8) & mask) & 0xf0000)
	var19 = var16 | ((ct2 << 0x8) & 0xf00)
	var20 = (ct2 << 0x4) & mask
	var21 = ct1 >> 0x1c
	var22 = var20 | var21
	var23 = var19 | (((var22 << 0x14) & mask) & 0xf00000)
	var24 = var18 | ((ct1 >> 0x18) & 0xf)
	
	var25 = (ct2 << 0xc) & mask
	var26 = (ct1 >> 0x14) | var25
	var27 = var24 | ((var26 << 0xc) & 0xf000)
	
	var28 = ((ct1 << 0x8) & mask) & 0xf000000
	var29 = var23 | ((ct1  >> 0x8) & 0xf0)
	var30 = var29 | (((ct1 << 0x8) & mask) & 0xf0000)
	
	var31 = ((ct1 >> 0x4) << 0x1c) & mask
	
	var32 = var30 | var31
	var33 = var27 | var28
	
	# print("result", hex(var32), hex(var33))
	tmp1[1] = var32 ^ 0x4c414355 ^ xor_val1[y]
	tmp1[0] = var33 ^ 0x43415241 ^ xor_val2[y]

# separator

for y in range(1):
	
	# print_hex(tmp1)
	result1 = 0
	for i in range(8):
		tmp2 = (tmp1[1] >> (4 * i)) | ((tmp1[0] << (32 - 4 * i)) & mask)
		index = tmp2 & 0xf
		result1 |= (dict1[index] << (4 * i))

	result2 = 0
	for i in range(8):
		tmp2 = tmp1[0] >> (i * 4)
		index = tmp2 & 0xf
		result2 |= (dict1[index] << (4 * i))
	
	# print("input", hex(result1), hex(result2))
	# correct
	first_block = [result2 >> 0x10, ((result1 << 0x10) & mask) >> 0x10]
	second_block = [((result2 << 0x10) & mask) >> 0x10, result1 >> 0x10]
	arr2 = []
	
	for x in range(2):
		tmp2 = first_block[x]
		arr1 = [0]
		for i in range(1, 0x10):
			arr1.append(tmp2 >> i)
		
		result3 = tmp2
		
		var1 = arr1[0x8] ^ arr1[0xc]
		var2 = arr1[0xb] ^ arr1[0xf]
		var3 = arr1[0x7] ^ arr1[0xb]
		var4 = arr1[0x4] ^ arr1[0x8]
		var5 = arr1[0xa] ^ arr1[0xe]
		
		result3 ^= var4
		
		var6 = arr1[0x6] ^ arr1[0xe]
		var7 = arr1[0x3] ^ var3
		var8 = arr1[0x2] ^ var6
		var9 = arr1[0x9] ^ arr1[0xd]
		var10 = arr1[0x1] ^ var9
		var11 = arr1[0x4] ^ var1
		var12 = arr1[0x7] ^ var2
		var13 = arr1[0x2] ^ arr1[0x6]
		var14 = var13 ^ arr1[0xa]
		var15 = var1 ^ tmp2
		var16 = arr1[0xd] ^ arr1[0x1]
		var17 = arr1[0x5] ^ var16
		var18 = var2 ^ arr1[0x3]
		var19 = var5 ^ arr1[0x6]
		var20 = arr1[0x1] ^ arr1[0x9] ^ arr1[0x5]
		var21 = arr1[0x4] ^ arr1[0xc] ^ tmp2
		var22 = arr1[0x3] ^ arr1[0x7] ^ arr1[0xf]
		var23 = var5 ^ arr1[0x2]
		var24 = arr1[0x5] ^ var9
		
		
		result4 = (result3 & 0x1)
		result4 |= (var7 << 0xf) 
		result4 |= (var8 << 0xe) & 0x4000
		result4 |= (var10 << 0xd) & 0x2000
		result4 |= (var11 << 0xc) & 0x1000
		result4 |= (var12 << 0xb) & 0x800
		result4 |= (var14 << 0xa) & 0x400
		result4 |= (var17 << 0x9) & 0x200
		result4 |= (var15 << 0x8) & 0x100
		result4 |= (var18 << 0x7) & 0xff
		result4 |= (var19 << 0x6) & 0x40
		result4 |= (var20 << 0x5) & 0x20
		result4 |= (var21 << 0x4) & 0x10
		result4 |= (var22 << 0x3) & 0x8
		result4 |= (var23 << 0x2) & 0x4
		result4 |= (var24 << 0x1) & 0x2
		
		result5 = ((result4 << 0x10) & mask) >> 0x10
		# print(hex(result4))
		
	
		tmp2 = second_block[x]
		arr1 = [0]
		# print("pt", hex(tmp2))
		for i in range(1, 0x10):
			arr1.append(tmp2 >> i)
		
		var1 = arr1[0x8] ^ arr1[0xc]
		var2 = arr1[0xb] ^ arr1[0xf]
		var3 = arr1[0xe] ^ arr1[0xa]
		var4 = arr1[0x7] ^ var2
		var5 = arr1[0x4] ^ var1
		var6 = arr1[0x6] ^ arr1[0xa]
		var7 = var6 ^ arr1[0x2]
		var8 = arr1[0x9] ^ arr1[0xd]
		var9 = arr1[0x5] ^ arr1[0xd]
		var10 = var9 ^ arr1[0x1]
		var11 = tmp2 ^ var1
		var12 = arr1[0x3] ^ var2
		var13 = var3 ^ arr1[0x6]
		var14 = arr1[0x1] ^ arr1[0x5]
		var15 = var14 ^ arr1[0x9]
		var16 = arr1[0x4] ^ arr1[0xc]
		var17 = var16 ^ tmp2
		var18 = arr1[0x7] ^ arr1[0xf]
		var19 = var18 ^ arr1[0x3]
		var20 = var3 ^ arr1[0x2]
		var21 = var8 ^ arr1[0x5]
		var22 = arr1[0x4] ^ arr1[0x8]
		var23 = var22 ^ tmp2
		var24 = arr1[0x7] ^ arr1[0xb]
		var25 = var24 ^ arr1[0x3]
		var26 = arr1[0x2] ^ arr1[0x6]
		var27 = var26 ^ arr1[0xe]
		var28 = var8 ^ arr1[0x1]
		
		result4 = (var5 & 0x1)
		result4 |= (var4 << 0xf) 
		result4 |= (var7 << 0xe) & 0x4000
		result4 |= (var10 << 0xd) & 0x2000
		result4 |= (var11 << 0xc) & 0x1000
		result4 |= (var12 << 0xb) & 0x800
		result4 |= (var13 << 0xa) & 0x400
		result4 |= (var15 << 0x9) & 0x200
		result4 |= (var17 << 0x8) & 0x100
		result4 |= (var19 << 0x7) & 0xff
		result4 |= (var20 << 0x6) & 0x40
		result4 |= (var21 << 0x5) & 0x20
		result4 |= (var23 << 0x4) & 0x10
		result4 |= (var25 << 0x3) & 0x8
		result4 |= (var27 << 0x2) & 0x4
		result4 |= (var28 << 0x1) & 0x2
		
		result6 = ((result4 << 0x10) & mask) >> 0x10
		arr2.append(result5)
		arr2.append(result6)
	# correct
	
	ct1 = (arr2[3] << 0x10) | arr2[2]
	ct2 = (arr2[0] << 0x10) | arr2[1]

	var7 = 0
	var8 = 0
	
	for j in range(8):
		var2 = (ct1 >> (0x4 * j))
		var3 = (ct2 << (32 - 0x4*j)) & mask
		var4 = var2 | var3
		var6 = 0x10 + (var4 & 0xf)
		index = (var6 & 0xf)
		var7 |= dict2[index] << (j*4)
	
	for j in range(8):
		var2 = (ct2 >> (0x4 * j))
		var3 = (ct1 << (32 - 0x4*j)) & mask
		var4 = var2 | var3
		var6 = 0x10 + (var4 & 0xf)
		index = (var6 & 0xf)
		var8 |= dict2[index] << (j*4)

	ct1 = (var7 ^ 0x4c414355 ^ 0xfd955cb1)
	ct2 = (var8 ^ 0x43415241 ^ 0x7ef84f78)


xor_val3 = [0xf1ac43aa, 0x25323c54, 0xe0e3610d, 0xca0c2399, 0]
xor_val4 = [0x85840851, 0xc882d32f, 0x64a51195, 0xd3b5a399, 0]

for y in range(5):

	# print("inp", hex(ct1), hex(ct2))
	var1 = ct2 >> 0x1c
	var2 = (var1 << 0x14) & mask
	var5 = ct2 >> 0x4
	var6 = (var5 << 0x1c) & mask
	var7 = var6 | var2
	
	var3 = (ct2 << 0x8) & mask
	var4 = (ct1 >> 0x18) & 0xf
	var8 = (ct2 >> 0x18)
	
	var9 = ((ct1 << 0x8) & mask) & 0xf00
	var10 = var4 | var9
	
	var11 = var8 & 0xf
	var12 = var7 | var11
	
	var13 = (ct2 >> 0x8) & 0xf000
	var14 = var13 | var10
	var15 = var3 & 0xf000000
	var16 = var12 | var15
	
	var17 = var16 | ((ct2 >> 0x8) & 0xf0)
	var18 = var14 | (var3 & 0xf0000)
	var19 = var17 | (var3 & 0xf00)
	
	var20 = (ct2 << 0x4)
	var21 = (ct1 >> 0x1c)
	var22 = var20 | var21
	var23 = var18 | (((var22 << 0x14) & mask) & 0xf00000)
	
	var24 = (ct2 << 0xc) & mask
	var25 = (ct1 >> 0x14)
	var26 = var24 | var25
	var27 = var19 | ((var26 << 0xc) & 0xf000)
	var28 = var23 | (((ct1 << 0x8) & mask) & 0xf000000)
	var29 = var28 | ((ct1 >> 0x8) & 0xf0)
	var30 = ((ct1 << 0x8) & mask) & 0xf0000
	var31 = ((ct1 >> 0x4) << 0x1c) & mask
	
	result1 = var29 | var31
	result2 = var27 | var30
	
	first_block = [result2 >> 0x10, ((result1 << 0x10) & mask) >> 0x10]
	second_block = [((result2 << 0x10) & mask) >> 0x10, result1 >> 0x10]
	arr2 = []
	
	for x in range(2):
		tmp2 = first_block[x]
		arr1 = [0]
		for i in range(1, 0x10):
			arr1.append(tmp2 >> i)
		
		result3 = tmp2
		
		var1 = arr1[0x8] ^ arr1[0xc]
		var2 = arr1[0xb] ^ arr1[0xf]
		var3 = arr1[0x7] ^ arr1[0xb]
		var4 = arr1[0x4] ^ arr1[0x8]
		var5 = arr1[0xa] ^ arr1[0xe]
		
		result3 ^= var4
		
		var6 = arr1[0x6] ^ arr1[0xe]
		var7 = arr1[0x3] ^ var3
		var8 = arr1[0x2] ^ var6
		var9 = arr1[0x9] ^ arr1[0xd]
		var10 = arr1[0x1] ^ var9
		var11 = arr1[0x4] ^ var1
		var12 = arr1[0x7] ^ var2
		var13 = arr1[0x2] ^ arr1[0x6]
		var14 = var13 ^ arr1[0xa]
		var15 = var1 ^ tmp2
		var16 = arr1[0xd] ^ arr1[0x1]
		var17 = arr1[0x5] ^ var16
		var18 = var2 ^ arr1[0x3]
		var19 = var5 ^ arr1[0x6]
		var20 = arr1[0x1] ^ arr1[0x9] ^ arr1[0x5]
		var21 = arr1[0x4] ^ arr1[0xc] ^ tmp2
		var22 = arr1[0x3] ^ arr1[0x7] ^ arr1[0xf]
		var23 = var5 ^ arr1[0x2]
		var24 = arr1[0x5] ^ var9
		
		
		result4 = (result3 & 0x1)
		result4 |= (var7 << 0xf) 
		result4 |= (var8 << 0xe) & 0x4000
		result4 |= (var10 << 0xd) & 0x2000
		result4 |= (var11 << 0xc) & 0x1000
		result4 |= (var12 << 0xb) & 0x800
		result4 |= (var14 << 0xa) & 0x400
		result4 |= (var17 << 0x9) & 0x200
		result4 |= (var15 << 0x8) & 0x100
		result4 |= (var18 << 0x7) & 0xff
		result4 |= (var19 << 0x6) & 0x40
		result4 |= (var20 << 0x5) & 0x20
		result4 |= (var21 << 0x4) & 0x10
		result4 |= (var22 << 0x3) & 0x8
		result4 |= (var23 << 0x2) & 0x4
		result4 |= (var24 << 0x1) & 0x2
		
		result5 = ((result4 << 0x10) & mask) >> 0x10
		# print(hex(result4))
		
	
		tmp2 = second_block[x]
		arr1 = [0]
		# print("pt", hex(tmp2))
		for i in range(1, 0x10):
			arr1.append(tmp2 >> i)
		
		var1 = arr1[0x8] ^ arr1[0xc]
		var2 = arr1[0xb] ^ arr1[0xf]
		var3 = arr1[0xe] ^ arr1[0xa]
		var4 = arr1[0x7] ^ var2
		var5 = arr1[0x4] ^ var1
		var6 = arr1[0x6] ^ arr1[0xa]
		var7 = var6 ^ arr1[0x2]
		var8 = arr1[0x9] ^ arr1[0xd]
		var9 = arr1[0x5] ^ arr1[0xd]
		var10 = var9 ^ arr1[0x1]
		var11 = tmp2 ^ var1
		var12 = arr1[0x3] ^ var2
		var13 = var3 ^ arr1[0x6]
		var14 = arr1[0x1] ^ arr1[0x5]
		var15 = var14 ^ arr1[0x9]
		var16 = arr1[0x4] ^ arr1[0xc]
		var17 = var16 ^ tmp2
		var18 = arr1[0x7] ^ arr1[0xf]
		var19 = var18 ^ arr1[0x3]
		var20 = var3 ^ arr1[0x2]
		var21 = var8 ^ arr1[0x5]
		var22 = arr1[0x4] ^ arr1[0x8]
		var23 = var22 ^ tmp2
		var24 = arr1[0x7] ^ arr1[0xb]
		var25 = var24 ^ arr1[0x3]
		var26 = arr1[0x2] ^ arr1[0x6]
		var27 = var26 ^ arr1[0xe]
		var28 = var8 ^ arr1[0x1]
		
		result4 = (var5 & 0x1)
		result4 |= (var4 << 0xf) 
		result4 |= (var7 << 0xe) & 0x4000
		result4 |= (var10 << 0xd) & 0x2000
		result4 |= (var11 << 0xc) & 0x1000
		result4 |= (var12 << 0xb) & 0x800
		result4 |= (var13 << 0xa) & 0x400
		result4 |= (var15 << 0x9) & 0x200
		result4 |= (var17 << 0x8) & 0x100
		result4 |= (var19 << 0x7) & 0xff
		result4 |= (var20 << 0x6) & 0x40
		result4 |= (var21 << 0x5) & 0x20
		result4 |= (var23 << 0x4) & 0x10
		result4 |= (var25 << 0x3) & 0x8
		result4 |= (var27 << 0x2) & 0x4
		result4 |= (var28 << 0x1) & 0x2
		
		result6 = ((result4 << 0x10) & mask) >> 0x10
		arr2.append(result5)
		arr2.append(result6)

	ct1 = (arr2[3] << 0x10) | arr2[2]
	ct2 = (arr2[0] << 0x10) | arr2[1]
	
	var7 = 0
	var8 = 0
	
	for j in range(8):
		var2 = (ct1 >> (0x4 * j))
		var3 = (ct2 << (32 - 0x4*j)) & mask
		var4 = var2 | var3
		var6 = 0x10 + (var4 & 0xf)
		index = (var6 & 0xf)
		var7 |= dict2[index] << (j*4)
	
	for j in range(8):
		var2 = (ct2 >> (0x4 * j))
		var3 = (ct1 << (32 - 0x4*j)) & mask
		var4 = var2 | var3
		var6 = 0x10 + (var4 & 0xf)
		index = (var6 & 0xf)
		var8 |= dict2[index] << (j*4)

	if y == 4:
		var1 = (inp[0] << 0x1f) & mask
		var2 = inp[1] >> 0x1
		var3 = var2 | var1
		var4 = (inp[1] << 0x1f) & mask
		var5 = inp[0] >> 0x1
		var6 = var5 | var4

		print(hex(var3), hex(var6))

		ct1 = var7 ^ 0x4c414355 ^ var3
		ct2 = var8 ^ 0x43415241 ^ var6
	else:
		ct1 = var7 ^ 0x4c414355 ^ xor_val3[y]
		ct2 = var8 ^ 0x43415241 ^ xor_val4[y]
	
ct1 ^= 0xc97c50dd
ct2 ^= 0xc0ac29b7
print(hex(ct1))
print(hex(ct2))

```


---

# Agent Instructions
This documentation is published with GitBook. GitBook is the documentation platform designed so that both humans and AI agents can read, navigate, and reason over technical content effectively. Learn more at gitbook.com.

## Querying This Documentation
If you need additional information that is not directly available in this page, you can query the documentation dynamically by asking a question.

Perform an HTTP GET request on the current page URL with the `ask` query parameter, and the optional `goal` query parameter:

```
GET https://kos0ng.gitbook.io/ctfs/write-up/2024/codegate-ctf-preliminary/reverse-engineering.md?ask=<question>&goal=<endgoal>
```

`ask` is the immediate question: it should be specific, self-contained, and written in natural language.
`goal` is optional and describes the broader end goal you are ultimately trying to accomplish on behalf of the user. GitBook uses it to tailor the answer towards what is most useful for that goal.

The response will contain a direct answer to the question and relevant excerpts and sources from the documentation.

Use this mechanism when the answer is not explicitly present in the current page, you need clarification or additional context, or you want to retrieve related documentation sections.
