首页
社区
课程
招聘
[原创]KCTF2024 第九题 第一次接触
发表于: 2024-9-3 14:13 2481

[原创]KCTF2024 第九题 第一次接触

2024-9-3 14:13
2481

判断序列号第一部分的前8位是否为"hellocat"

序列号的第一部分需要以"hellocat"开头,长度不确定

序列号的第二部分通过计算0x8FA7C86/3得到0x2FE2982,十进制为50211202,再经过翻转,得到20211205。同时也满足各位数值相加等于0xD的条件。由于50211202和050211202转换为整数时的结果相同,均为0x2FE2982,因此前面加多少个0都没事,也就是说序列号第二部分需要以"20211205"开头,长度不确定

最后一部分,按照给出的运算逻辑显然无论如何都没法凑出0x10000039。而目标地址变量的地址dword_531E9C刚好在第三部分序列号之后(经过strcpy后)。因此序列号第三部分可以输入9位长度,使得最后一位覆盖dword_531E9C的最低字节为0x39(只要设置第9位为9),并让前面的条件判断均不执行。这里需要构造的逻辑有2个:

由于三部分等长,因此均为9位:

最后只需要将4皇后的两种可能分别代入,再对第一部分的最后一位爆破一下即可

  • 序列号长度能被3整除
  • 序列号组成只能包含0-9,a-z
  • str[0] < str[2] < str[4] < str[6]
  • str的前8位转换为坐标后可以通过4皇后算法(共两种可能)
  • check1 -> hellocat?
  • check 2 -> reverse(050211202) -> 202112050
  • check 3 -> a2b4c1d39 / a3b1c4d29
  1. 接收序列号:
    • 序列号长度能被3整除
    • 序列号组成只能包含0-9,a-z
  2. 将序列号等分成3个部分,分别进行校验
  3. 最后对整个序列号进行转换,得到新的字符串并与"40d511825ecbc207eb6ef9a7b1c6e34b"进行比较
  1. 调用reverseStr对序列号的第二部分进行翻转
  2. 对翻转后字符串的每一位数字相加,判断总和是否等于0xD
  3. 将翻转后的字符串转为整数并乘3,判断是否等于0x8FA7C86
  1. 变量dword_531E9C会被初始化为0x10000000
  2. 序列号的第三部分会影响对变量dword_531E9C的运算
  3. 若变量dword_531E9C经过运算后等于0x10000039,则通过校验
  1. 序列号的第一部分需要以"hellocat"开头,长度不确定

  2. 序列号的第二部分通过计算0x8FA7C86/3得到0x2FE2982,十进制为50211202,再经过翻转,得到20211205。同时也满足各位数值相加等于0xD的条件。由于50211202和050211202转换为整数时的结果相同,均为0x2FE2982,因此前面加多少个0都没事,也就是说序列号第二部分需要以"20211205"开头,长度不确定

  3. 最后一部分,按照给出的运算逻辑显然无论如何都没法凑出0x10000039。而目标地址变量的地址dword_531E9C刚好在第三部分序列号之后(经过strcpy后)。因此序列号第三部分可以输入9位长度,使得最后一位覆盖dword_531E9C的最低字节为0x39(只要设置第9位为9),并让前面的条件判断均不执行。这里需要构造的逻辑有2个:

    • str[0] < str[2] < str[4] < str[6]
    • str的前8位转换为坐标后可以通过4皇后算法(共两种可能)
  4. 由于三部分等长,因此均为9位:

    • check1 -> hellocat?
    • check 2 -> reverse(050211202) -> 202112050
    • check 3 -> a2b4c1d39 / a3b1c4d29
  5. 最后只需要将4皇后的两种可能分别代入,再对第一部分的最后一位爆破一下即可

  • 接收序列号:
    • 序列号长度能被3整除
    • 序列号组成只能包含0-9,a-z
  • 序列号长度能被3整除
  • 序列号组成只能包含0-9,a-z
  • 将序列号等分成3个部分,分别进行校验

  • [招生]科锐逆向工程师培训(2024年11月15日实地,远程教学同时开班, 第51期)

    收藏
    免费 1
    支持
    分享
    最新回复 (0)
    游客
    登录 | 注册 方可回帖
    返回
    //