ezreCTF
本帖最后由 zishen 于 2023-12-22 22:59 编辑今天遇到一个CTF题
from ctypes import *
from Crypto.Util.number import bytes_to_long
from Crypto.Util.number import long_to_bytes
def encrypt(v, k):
v0 = c_uint32(v)
v1 = c_uint32(v)
sum1 = c_uint32(0)
delta = 195935983
for i in range(32):
v0.value += (v1.value << 4 ^ v1.value >> 7) + v1.value ^ sum1.value + k
sum1.value += delta
v1.value += (v0.value << 4 ^ v0.value >> 7) + v0.value ^ sum1.value + k
return (v0.value, v1.value)
if __name__ == '__main__':
flag = input('please input your flag:')
k = [
255,
187,
51,
68]
if len(flag) != 32:
print('wrong!')
exit(-1)
a = []
for i in range(0, 32, 8):
v1 = bytes_to_long(bytes(flag, 'ascii'))
v2 = bytes_to_long(bytes(flag, 'ascii'))
a += encrypt([
v1,
v2], k)
enc = [
0xEEC7D402L,
0x99E9363FL,
0x853BDE61L,
558171287,
0x908F94B0L,
1715140098,
986348143,
1948615354]
for i in range(8):
if enc != a:
print('wrong!')
exit(-1)
print('flag is flag{%s}' % flag)
根据这个python代码逆向写出脚本,自己没写出来,看别人的:
是这样的
但是这点很懵,这点还原不是很理解,为什么 要 >>24、16、8 为什么要 ^0xFF ?
wp链接:https://blog.csdn.net/shenkong_/article/details/127359568
请大佬解答!!!
本帖最后由 solly 于 2023-12-23 11:25 编辑
>>24、16、8 ,是交换顺序,因为后面按字符输出,而整数在内存中是小端保存,顺序是反的,所以输出前反序一下。至于那个 ^FF000000,没什么用,因为u_int 右移24,16,8位后,最高位至少8bits是0,虽然^FF000000后前面8bits又变成了FF,但后面进行了类型转换成 char 了,前面24bits都丢掉了,所以不影响结果。你把 ^FF000000 去掉后,输出结果不会有变化。 ^0xff后只取ff遮盖的那些位,其他位忽略了 扣代码的都是高手
页:
[1]