软件漏洞分析入门(四)

IDA密码算法自动化识别插件、脚本汇总 在逆向过程中,自动识别文件中存在的密码算法。原理上只有两条路 1、密码算法中的常量特征(常数、s盒等); 2、特定加密库的独有特征(字符串、指令流等)。 现有工具特点: 1、大多都是根据密码算法的常量特征进行识别,很少包含特定加密库的特征。 2、都是以反汇编工具(IDA/Ghidra)的插件、脚本形式存在。 3、都是基于静态分析,也就是只能识别静态特征。如果特征在运行时动态生成,则无能为力。 findcrypt系列 FindCrypt和FindCrypt2 最初的基础,2006年hex 阅读详情

逆向例题分析

我们通过三道例题来探索一下逆向具体的过程

SecondReverse.exe

我们先正常运行一下这个程序看看他的程序逻辑

image-20220606004846503

可以看出这个程序需要输入一串字符串来通过验证,而我们的目标就是通过逆向找到我们需要输入的字符串,直接拖到IDA里面

image-20220606005019662

可以看出,这个程序的逻辑流程并不复杂,接受了一次字符串的输入之后进行判断,然后一个是正确分支,一个是错误分支,我们直接F5反编译一下

image-20220606015038710

int __cdecl main(int argc, const char **argv, const char **envp)
{
  signed int v3; // esi@1
  char v4; // al@2
  char v6[52]; // [sp+Ch] [bp-38h]@3

  printf("Please give me your input: ");
  v3 = 0;
  do
  {
    v4 = getchar();
    if ( v4 == 10 )  //回车符就结束
      break;
    v6[v3++] = v4;
  }
  while ( v3 < 40 );
  v6[v3] = 0;
  if ( sub_401000() )
    printf("Good! The flag is your input!!!\n");
  else
    printf("Sorry! You are wrong!!!\n");
  system("pause");
  return 0;
}

这段是main函数,分析可知,程序循环读取我们输入的字符,输入回车就结束读取,然后进入 sub_401000() 函数判断字符串是否正确

我们继续进入这个 sub_401000()

image-20220606015524934

首先这个字符串长度得是37位,然后进行一段最关键的循环判断

while ( *(&aGmbhXfmd1nfU1U[v1 - aGmbhXfmd1nfU1U] + result) + 1 == aGmbhXfmd1nfU1U[result] )
    {
      if ( ++result >= 37 )
      {
        if ( result == 37 )
          result = 1;
        return result;
      }
    }

这段的意思就是把我们输入的字符串每个字符都分别 +1 之后要和 aGmbhXfmd1nfU1U 这个里面的字符串相等

我们直接看看这段字符串是什么

image-20220606025125435

知道了验证函数的逻辑,也知道了字符串,我们直接写脚本

aa 就是程序里面需要对比的字符串,由于我们需要得到的 flag 需要 +1 才能得到 aa,所以我们循环 aa 然后都 -1 就得到了正确的 flag

image-20220606025329132

把这个flag输入程序,正确

image-20220606041559562

DecryptPlayer.exe

依然是先打开程序,我们随便输入一些字符,可以看到这次的程序验证分为了两步,先输入一个 key 然后还需要输入一个 activation code 进行验证,判断验证不通过之后显示 wrong code

image-20220606030054481

用IDA打开程序开始逆向分析

image-20220606030550749

整体分支也不算复杂,第一步先判断有没有发生这个 code broken 如果没有发生则正常运行,先输入 key 然后后面call了一个自定义函数之后根据结果判断成功或者失败,我们F5反编译一下看看

image-20220606031106971

在程序开头,先声明了一批变量,这些后面肯定用得到

  v14 = 11;
  v15 = 45;
  v16 = 667;
  memset(&v17, 0, 0x184u);
  v8 = 0;
  memset(&v9, 0, 0x18Cu);
  v10 = -1929852969;
  v11 = -1929852943;
  v12 = -1929853625;

忽略掉中间一段对我们没用的代码,这个程序最核心的代码就是

printf("please input your key:\n");
  scanf("%x", &v7);
  sub_401040(&v8, v7, (int)&v14);
  v5 = 0;
  while ( *(int *)((char *)&v8 + v5 * 4) == *(int *)((char *)&v10 + v5 * 4) )
  {
    ++v5;
    if ( v5 >= 3 )
    {
      printf("Success\n");
      goto LABEL_10;
    }
  }
  printf("Failed\n");
LABEL_10:
  system("pause");
  return 0;

在要求用户输入字符串之后,程序把这段输入的字符串放到了v7里面,然后函数sub_401040被传入了三个参数并执行了,分别是v8,v7以及v14,其中v8初始化为0,v7是用户输入的字符串,v14是11,我们继续进入这个函数看看

image-20220606032111630

我们发现,程序验证的第二步原来是在这个函数里面,而且这个 activation code 如果不为 51 的话就直接回显 wrong code 了,所以这一步我们直接知道了通过后半段验证的关键

printf("please enter activation code:");
  scanf("%i", &v11);
  if ( v11 != 51 )
    sub_401010((int)"wrong code");

我们继续往下看,这个函数的后半段对v3指针的地方进行了编辑,而v3也就是函数传入的第一个参数,即主函数里面的v8,也就是说这个函数的作用是对v8进行编辑

  v5 = 0;
  v6 = a3 - (_DWORD)v3;
  dword_42DE28 = v4 ^ 0x5F5B884;
  for ( i = a3 - (_DWORD)v3; ; v6 = i )
  {
    v7 = dword_42DE28 ^ *(int *)((char *)v3 + v6);
    result = _time64(0);
    if ( result > 1667658196 )
    {
      v9 = _time64(0);
      printf("%#lu", v9);
      sub_401010((int)"expired");
    }
    *v3 = v7;
    ++v5;
    ++v3;
    if ( v5 >= 3 )
      break;
  }

我们再回去看看主函数执行了这个函数之后会发生什么

  v5 = 0;
  while ( *(int *)((char *)&v8 + v5 * 4) == *(int *)((char *)&v10 + v5 * 4) )
  {
    ++v5;
    if ( v5 >= 3 )
    {
      printf("Success\n");
      goto LABEL_10;
    }
  }
  printf("Failed\n");

这段的意思就是从v8首地址开始连续三块以 4char 为单位的内存需要和从v10首地址开始内存存放的东西一模一样才能输出 Success ,知道了要求之后我们再去看那个sub_401040函数,因为就是这个函数改变了v8

  v5 = 0;
  v6 = a3 - (_DWORD)v3;
  dword_42DE28 = v4 ^ 0x5F5B884;
  for ( i = a3 - (_DWORD)v3; ; v6 = i )
  {
    v7 = dword_42DE28 ^ *(int *)((char *)v3 + v6);
    result = _time64(0);
    if ( result > 1667658196 )
    {
      v9 = _time64(0);
      printf("%#lu", v9);
      sub_401010((int)"expired");
    }
    *v3 = v7;
    ++v5;
    ++v3;
    if ( v5 >= 3 )
      break;
  }

分析这段代码,dword_42DE28就是v4和 0x5F5B884 按位异或的结果,而v4就是用户的输入。v6是a3和v3地址的偏移量,而v3就是a1,下面的for循环的意思就是,v8首地址开始写入一个dword_42DE28和a3首地址开始的数据异或的结果,而a3也就是主函数里面的v14,这样的循环一共三次

知道这个逻辑之后,我们还需要知道几个信息,第一个是函数里面的a3首地址开始到底是什么样的数据,实际上我们可以从主函数的开头声明看出来,a3在主函数里面对应的v14以及后面的v15,v16在内存上都是连续的

image-20220606035206870

即使没注意到没看出来,我们也可以动态调试

我们在IDA里面找到异或的这段汇编

image-20220606035713441

同时在 x32dbg 里面找到对应位置

image-20220606035829472

我们进入此时的 esi 对应的内存看看,发现对应的就是那三个变量v14,v15,v16

image-20220606040030028

我们需要知道的第二个信息是主函数里面v10开始对应的内存是什么

  v5 = 0;
  while ( *(int *)((char *)&v8 + v5 * 4) == *(int *)((char *)&v10 + v5 * 4) )
  {
    ++v5;
    if ( v5 >= 3 )
    {
      printf("Success\n");
      goto LABEL_10;
    }
  }
  printf("Failed\n");

只看IDA的开头声明依然可以直接看出v10,v11,v12这三个变量是连续的

image-20220606040418172

当然不放心的话我们也去动态调试一下

这个就是主函数比较那里的代码对应的汇编

image-20220606040612288

去 x32dbg 相同的位置设断点并查看对应的内存

image-20220606040842829

能明显看出这个对应的就是v10,v11,v12三个变量对应的数据

image-20220606040937055

知道了逻辑也知道了所有内存的信息,我们可以开始编写脚本进行逆向

image-20220606041425317

其中D1就是dword_42DE28,实际上只需要循环中的一次来逆向得到密码,这里f1,f2,f3得到的结果都是一样的

我们把密码输入程序,activation code 就是之前已经知道的 51,显示成功

image-20220606042124492

reversePractice.exe

最后一个程序,依然是先打开

image-20220606042329164

逻辑就是用户输入字符串然后进行验证,失败就直接关闭窗口

我们用IDA打开他,可以看出这次的程序分支还是比较多比较复杂的

image-20220606042516571

F5反编译之后发现其实没有那么复杂

image-20220606042621341

int __cdecl main(int argc, const char **argv, const char **envp)
{
  int v3; // eax@1
  signed int v4; // ecx@1
  char v5; // dl@2
  signed int i; // esi@5
  int result; // eax@8
  char v8; // [sp+4h] [bp-64h]@1
  char v9; // [sp+5h] [bp-63h]@1
  __int16 v10; // [sp+65h] [bp-3h]@1
  char v11; // [sp+67h] [bp-1h]@1

  v8 = 0;
  memset(&v9, 0, 0x60u);
  v10 = 0;
  v11 = 0;
  puts(aPleaseInputASt);
  scanf(aS, &v8);
  v3 = 0;
  v4 = strlen(&v8);
  if ( v4 <= 0 )
  {
LABEL_5:
    for ( i = 0; i < v4; ++i )
      *(&v8 + i) = (3 * *(&v8 + i) - 284) % 26 + 97;
    if ( !strcmp(&v8, aQxbxpluxvwhuzj) )
      puts(aOkYouReallyKno);
    else
      puts(aSorry);
    result = system(aPause);
  }
  else
  {
    while ( 1 )
    {
      v5 = *(&v8 + v3);
      if ( v5 < 97 || v5 > 122 )
        break;
      if ( ++v3 >= v4 )
        goto LABEL_5;
    }
    result = -1;
  }
  return result;
}

这个程序的大致逻辑就是,用户输入的字符串进入了v8,然后逐字符验证,必须要满足每个字符值 ≥97 并且 ≤122

while ( 1 )
{
    v5 = *(&v8 + v3);
    if ( v5 < 97 || v5 > 122 )
        break;
    if ( ++v3 >= v4 )
        goto LABEL_5;
}

然后v8开始进行逐字符的一个自变化算法,变化完成之后要和 aQxbxpluxvwhuzj 这个字符串进行比对,如果一样就正确,不一致则错误

for ( i = 0; i < v4; ++i )
    *(&v8 + i) = (3 * *(&v8 + i) - 284) % 26 + 97;
if ( !strcmp(&v8, aQxbxpluxvwhuzj) )
    puts(aOkYouReallyKno);
else
    puts(aSorry);

我们点进这个 aQxbxpluxvwhuzj 字符串

image-20220606043412685

现在知道了字符串也知道了程序的逻辑,直接开始编写脚本进行逆向

image-20220606043510534

由于这里的算法设计到模运算,如果纯进行逆向算法,会产生很多同时满足的结果再根据条件进行筛选,这样代码量比较大,所以既然程序逻辑给了字符值的限制,我们可以直接在范围内循环然后找到在这个字符值条件区间里面符合算法的那个字符,这样一个一个拼接,最终就得到了正确的flag

我们把flag输入原程序,正确

image-20220606043828882


这三题逆向题在加密的算法上各不相同,有字符值直接加减,有异或运算,也有模运算,在逆向题的大类中,掌握了这些属于最基本的算法,逆向的大门已经朝我们敞开了

【CTF-Reverse中的加密算法】密码算法特征识别,变种密码算法分析 上一章中我们带领大家了解了加密算法——RC4,TEA,Base64算法的原理,但是加密算法远不止这些,需要大家自行去学习,在这一章中,我来带领大家了解密码算法特征识别,变种密码算法分析。 阅读详情

相关推荐

软件供应链安全——组件漏洞的治理

前 言 漏洞库:漏洞数据库,主要指大型的、公开的、业界公认的漏洞数据库。比如NVD、CNVD、exploit-db等。 CVE:给每个漏洞确定唯一名称,通过CVE可以帮助安全人员快速在漏洞数据库中找到相应的漏洞信息。 CPE:漏洞所关联的产品、版本、依赖路径或命名规范等信息,通过CPE信息,可以知道某个CVE所影响的组件版本和所在产品的依赖路径。 CWE:漏洞的类型,比如某3个组件都存在SQL注入漏洞,这3个漏洞的CVE并不相同,但CWE都可描述为CWE-89 SQL...

m0_50579386的博客 3759

菜鸡学逆向——常见编码,加密算法逆向总结

最近打CTF太郁闷了,总是被逆向出来自己见过但又偏偏想不起来的算法。这次总结个大个的 Base64 代码参考52pojie论坛的kabeo大佬,原文地址:https://www.52pojie.cn/thread-793420-1-1.html #include <stdio.h> #include "string.h" #include "stdlib.h" const char ...

qq_43557177的博客 5760

NVD软件漏洞数据处理及分类方法总结

目录 一、前言 二、软件漏洞数据分析 三、软件漏洞分类实验流程 四、软件漏洞文本预处理 五、软件漏洞文本表示方法 六、软件漏洞分类模型构建 七、软件漏洞分类实验结果与分析 八、总结 一、前言 本人研究生期间的研究主方向为:网络空间安全方向,基于研究方向做过入侵检测实验、软件缺陷分类实验、软件安全漏洞分类管理实验等,网络安全方向相关数据集可参看个人总结:网络安全相关数据集介绍与下...

分享实践与思考 7118

Bugku-杰瑞的下午茶

先运行测试一下程序,发现还是要求出flag,所以开始分析程序,先查壳,因为用ida分析我并没有像往常一样成功,所以还是用od动调 经过刚才运行程序发现,有一串字符,所以首先尝试od搜索字符串定位到那个地方 找到了程序开始的地方,从这里开始单步调试 输入我们的测试字符串123456789 继续向下运行将参数61,62压入栈,但并不知道有什么用,进入下面这个函数看一看 有一些操作,但并没有看出来是什么意思 跳过这个函数继续分析,数据窗口跟随,发现我们输入的字符串传入了下一...

qq_51600802的博客 945

软件漏洞分析入门.CHM

软件漏洞分析入门.CHM软件漏洞分析入门.CHM软件漏洞分析入门.CHM

群晖NAS下docker安装MySql

本文将一步一步讲解如何在群晖NAS的docker中启用一个MySQL容器 , 算是初学者对问题解决的一个记录.

qq_46375248的博客 5978

Android 逆向分析

Android程序的特点相比在于使用混淆方式打包,将包名、类名、函数名改成不易看懂的字母,从而使生成的apk小很多(android studio提供了release编译方式,使用proguard混淆),因此反编译apk最多的工作在于重构这些名称,这一点和pc上一致,对于android native程序(jni)则和pc上基本一致,不同之处在于常见的是arm汇编。轻量级反编译,反编译jar/class等java字节码文件(能力一般),提供简单的搜索能力。解决没有USB数据线的情况下的调试。

工宗浩生财指南针 2281

SAP SD POD 配置与 VLPOD 操作:3步解决发货10件开票7件的业务场景

本文详细解析了SAP SD POD功能在解决发货与开票数量差异中的应用,通过3步配置法实现精准匹配。重点介绍了POD核心逻辑、关键配置步骤及VLPOD操作技巧,帮助企业高效处理易损品运输等复杂场景,提升供应链管理效率。

weixin_30613343的博客 396

栈溢出攻击c语言_软件漏洞分析入门(四)初级栈溢出C_修改程序流程

Tobetheapostrophewhichchanged“Impossible”into“I'mpossible” ——failwest没有星星的夜里,我用知识吸引你上节课没有操练滴东西,不少蠢蠢欲动的同学肯定已经坐不住了。悟空,不要猴急,下面的两堂课都是实践课,用来在实践中深入体会上节课中的知识,并且很有趣味性...

weixin_39981681的博客 281

从零搭建企业级AI网关:基于LiteLLM的安全防护体系设计

本文详细介绍了如何从零搭建企业级AI网关,基于LiteLLM构建全面的安全防护体系。内容涵盖分层防御架构、敏感数据处理、合规性配置与审计追踪,以及生产环境部署策略,助力企业安全高效地集成LLM技术,确保数据安全和合规性。

qq_27496129的博客 1292

Mike 21如何制作随水深变化的糙率文件

MIKE 21如何制作随水深变化的糙率文件

zhuzhujiayoua的博客 2250

软件漏洞概述

文章目录一、软件漏洞的概念1、信息安全漏洞简述2、软件漏洞3、软件漏洞概念4、软件漏洞的成因分析二、软件漏洞标准化管理1、软件漏洞分类2、软件漏洞分级3、安全漏洞管理规范 一、软件漏洞的概念 1、信息安全漏洞简述 信息安全漏洞是信息安风险的主要根源之一,是网络攻防对抗中的主要目标。由于信息系统漏洞的危害性、多样性和广泛性,在当前网路空间博弈中,漏洞作为一种战略资源被各方所积极关注。 对于信息安全漏洞的不同认识有以下三个主要的共同特点: 漏洞是信息系统自身的弱点或缺陷。 漏洞存在环境通常是特定的。 漏洞具有

W0ngk,一个安全菜鸡,一直在模仿,尚未有超越。 7813

EFR32无线SoC开发指南:从环境搭建到性能优化

物联网边缘设备开发中,无线SoC芯片的选择与开发环境配置是关键第一步。EFR32作为Silicon Labs推出的多协议无线SoC系列,配合Simplicity Studio IDE,为开发者提供了完整的解决方案。本文以EFR32xG22开发套件为例,详细介绍开发环境搭建、工程创建、硬件配置等核心环节,特别针对RAILtest示例工程进行深入解析。通过实际案例演示如何配置无线参数、优化低功耗模式,并分享串口终端交互、吞吐量测试等实战技巧。对于开发者常见的问题如设备识别失败、无线通信异常等,提供了系统化的排查

weixin_30342363的博客 356

软件漏洞分析简述

软件漏洞 1.1漏洞的定义 漏洞,也叫脆弱性(英语:Vulnerability),是指计算机系统安全方面的缺陷,使得系统或其应用数据的保密性、完整性、可用性、访问控制等面临威胁。 漏洞在各时间阶段的名称 根据是否公开分为:未公开漏洞、已公开漏洞 根据漏洞是否发现分为:未知漏洞、已知漏洞 根据补丁和利用价值是否发布分为:0day漏洞、1day漏洞、历史漏洞 图1 漏洞在各时间阶段的名称 漏洞的特...

fufu_good的博客 8万+

【AI for Medecine】吴恩达医学图像AI专项课程(诊断、预测、治疗)

近期需要简单了解AI4Science上的一些应用,看到吴恩达大佬的专项课程,于是开始来个“全面”的了解--医学人工智能(诊断、预测、治疗)。

图挖掘领域,新晋砖家 ☞ 未来可期,欢迎和静静一起学习交流吖 783

UE实现贴地线(SurfaceLine)效果

UnrealEngine实现贴地线效果

专注GIS开发 4573

软件漏洞分析入门

原帖链接:http://bbs.pediy.com/showthread.php?t=56445  1 引子 To be the apostrophe which changed “Impossible” into “I’m possible” —— failwest  凉风有讯,秋月无边。 您是否梦想过能够像电影上演的那样黑进任意一台机器远程操控?您的梦想是否曾经被书店里边满架子的反黑,

foolzhang的专栏 8684

遥感图像地物覆盖分类,数据集制作-分类模型对比-分类保姆级教程

1.新建shp文件地理坐标系保持和影像一致,面类型2.打开属性表3.添加字段这里分类6类,点击添加值添加添加完毕开始人工选地物类型,制作数据集开始标注,标注的时候可以借助谷歌地图来看标记足够多的样本打开面转栅格工具设置nodata值为15。

热爱分享,热爱记录 2526

论文精读(二)| 开源软件漏洞感知技术综述

本文综述了开源软件漏洞感知技术的研究进展。开源软件的透明性和协同开发特性虽促进了创新,但也带来了独特的漏洞防御挑战。文章从漏洞生命周期角度,系统梳理了三大类技术:1)基于代码分析的方法(包括机器学习、静态/动态分析和混合技术);2)基于社区讨论的文本挖掘技术;3)基于补丁分析的反向推理方法。研究指出,当前主流技术仍集中于代码层面(占比62%),而社区和补丁分析是新兴方向。挑战包括数据集质量、误报率和供应链安全等问题,未来需要融合AI与程序分析、构建全生命周期防御体系。该领域正转向多维度协同防御,以应对开源生

Pocker_Spades_A的博客 1万+

汉书HE8,好用的汇编代码编写工具

汉书HE8,好用的汇编代码编写工具早期编写汇编代码所用功能强大

大中型超市收银系统(可直接运行)

光步前台收银系统系统功能:商品销售、商品退货、挂单、收银员权限、会员销售、单品取消、整单取消、商品查询、脱机销售、脱机数据上传,基本资料下载,开钱箱、小票打印、收款结算,支持多币种付款方式(现金、储值卡、礼券、微信等),支持多种促销。运行环境:.net 4.0登陆信息用户名:1001 密码:123456内置商品信息,商品编码可输入00001000 - 00010000,测试效果相关功能键F5 结算 F9挂单 F11商品查询 F8退货 Insert单品取消 Del整单取消 F12开钱箱F2 会员 Ctrl+Z退出系统 Home 锁屏 相关源码待公开

软件安全漏洞分析与发现 复习笔记

略。查ppt。修正:上图中的语句2 的可到达语句不包括4。定义集合我们先确定每个语句的 Gen 和 Kill 集合:路径分析接下来我们分析从入口到 [9] 的所有路径:在每个路径上,我们计算每个语句的 In 和 Out 集合。路径1: [0] -> [1] -> [2] -> [3] -> [4] -> [5] -> [9]In(0) = {}

skysys的研究小屋 1695

RU DOS版、EFI版32bit/64bit BIOS常用工具

DOS版、EFI版的RU工具,可用来查看IO、MEM、PCI、SMBIOS等资源。亲测在EFI SHELL下可用。

Nessus 漏洞扫描与分析软件

最近攻击机一直无法成功利用靶机暴露出来的漏洞,怀疑是旧漏洞利用软件的问题,使用了当前流行的 Nessus 扫描软件,果然如此。本章介绍 Nessus软件的安装和使用。之前使用了大佬 21superman的漏洞利用软件扫描自己搭建的靶机,不确定是否有这个漏洞(毕竟github已经找不到该软件),攻击机一直无法成功。使用了本章介绍了 Nessus软件,确实很全面且一直在更新漏洞库,推荐给大家的同时也方便自己做记录。

cc123489ll的博客 1202

win10 跳过U8环境检测的IE WebControls.rar

win10 安装u8的时候 提示IE WebControls 不通过,这个工具可以欺骗u8的检查。 跳过U8环境检测的IE WebControls。提示导入失败后,重新检测通过。

网络安全漏洞与修复 网络安全软件漏洞

给小伙伴们的意见是想清楚,自学网络安全没有捷径,相比而言系统的网络安全是最节省成本的方式,因为能够帮你节省大量的时间和精力成本。坚持住,既然已经走到这条路上,虽然前途看似困难重重,只要咬牙坚持,最终会收到你想要的效果。黑客工具&SRC技术文档&PDF书籍&web安全等(可分享)网络安全产业就像一个江湖,各色人等聚集。

Hacker_Nightrain的博客 1833

软件漏洞及检测技术概述

首席安全官Plus是一个围绕“大数据、云计算和人工智能”高技术领域,发布相关网络安全前沿技术和产业趋势的平台,努力打造“有特色、高水平、国际化”的网络安全思想高地。如投稿,请发送到:csoplus@163.com。 软件的质量是软件产品的生命线,其质量问题的根源在于软件设计的不合理以及...

网络空间发展与战略研究 3032

软件漏洞自动化利用,零基础入门到精通,收藏这篇就够了_漏洞利用

近年来软件漏洞数目急剧增加,漏洞危害也引起业界广泛关注. 准确、高效、快速地编写出漏洞利用代码是漏洞危害性评估和漏洞修复的关键. 当前漏洞利用代码主要依赖人工手动分析编写,效率较低. 因此,如何实现自动化的漏洞利用代码生成是该领域研究的热点和难点.

wananxuexihu的博客 1183
上一篇: Libtomcrypt密码库的使用
下一篇: iptables和snort基本配置
[l_l]
博客等级 码龄7年 3181粉丝 11原创
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值