zishen 发表于 2023-12-22 22:54

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:17

本帖最后由 solly 于 2023-12-23 11:25 编辑

>>24、16、8 ,是交换顺序,因为后面按字符输出,而整数在内存中是小端保存,顺序是反的,所以输出前反序一下。至于那个 ^FF000000,没什么用,因为u_int 右移24,16,8位后,最高位至少8bits是0,虽然^FF000000后前面8bits又变成了FF,但后面进行了类型转换成 char 了,前面24bits都丢掉了,所以不影响结果。你把 ^FF000000 去掉后,输出结果不会有变化。

Light紫星 发表于 2023-12-23 00:06

^0xff后只取ff遮盖的那些位,其他位忽略了

xixicoco 发表于 2023-12-23 02:20

扣代码的都是高手
页: [1]
查看完整版本: ezreCTF