分组密码总结-DES,AES,SM4

简介 分组密码属于对称密码的一种,其特点是加解密都是对明文/密文进行分组后逐组进行加解密。通俗讲就是将明文分块,然后分块加密,解密同理。 分组密码的基本原理: 代换:明文分组到密文分组的可逆变换 扩散:将明文的统计特性散布到密文中去,使得明文的每一位影响密文中多位的值 混淆:使密文和密钥之间的统计关系变得尽可能复杂,使攻击者无法得到密钥,通常使用复杂的代换算法实现 分组密码体制基本上都是基于乘积(由一系列代换和置换构成)和迭代来构造的。常见的分组密码结构有Feistel网络和SP(Substitution Permutation)网络。DES算法和AES算法分别就是基于Feistel网络和SP网络实现的。 Feistel网络的加密过程为:将明文$x$一分为二,即$x=L_0R_0$,$L_0$是左边的$m$bit,$R_0$是右边的$m$bit,于是对于迭代次数$r$,设$1\le i\le r$,则: $$\left \{ \begin{array}{c} L_i=R_{i-1} \\ R_i=L_{i-1}\oplus F(R_{i-1},K_i) \end{array} \right.,F为圈函数$$ 为了可以利用同一个算法进行加密和解密,Feistel分组密码加密过程的最后一轮没有左右对换。 SP网络主要是对明文进行两项操作:由子密钥控制的替换S、置换或可逆的线性变换P。前者主要起混淆作用,后者主要起扩散作用。 设计分组密码,有以下几个要求: 分组长度$n$要足够大 密钥量要足够大(置换字集中的元素足够多),尽可能消除弱密钥 由密钥确定的置换算法要足够复杂,充分实现扩散和混淆 加解密运算简单,易于实现 数据扩展(一般没有) 差错传播尽可能小 DES DES(Data Encryption Standard)是第一个众所周知的分组密码,其分组长度为64bit,密钥长度也为64bit。于1977年1月15日被公布,现已被AES取代。 DES采用Feistel网络进行实现,一共迭代16轮,64bit密钥中包含56bit密钥和8bit奇偶校验位。下图简要介绍了其工作原理: 初始置换和逆初始置换 初始置换和逆初始置换在密码方面作用不大,其主要作用是打乱明文ASCII码字划分的关系,打乱各位的次序。 初始置换 58 50 42 34 26 18 10 2 60 52 44 36 28 20 12 4 62 54 46 38 30 22 14 6 64 56 48 40 32 24 16 8 57 49 41 33 25 17 9 1 59 51 43 35 27 19 11 3 61 53 45 37 29 21 13 5 63 55 47 39 31 23 15 7 逆初始置换 408481656246432 397471555236331 386461454226230 375451353216129 364441252206028 353431151195927 342421050185826 33141 949175725 置换的方法是,将置换表中数字对应位置的值替换原来的值。经过初始置换,明文$X$变为: ...

Apr. 8, 2020 · 3 min · 509 words · Jiekang Hu

XCTF攻防世界 WriteUp(Web)

感觉XCTF这个平台还是8错的,题目量也多质量也还可以,准备后面慢慢刷 新手区还是太简单了。。。这里就不放WriteUp了,直接整进阶区的 平台链接:https://adworld.xctf.org.cn/task baby_web Hint:想想初始页面是哪个 打开页面会自动跳转至1.php,尝试输入index.php访问,然后发现302跳转至1.php,然后在302响应头里找到flag: Training-WWW-Robots 这题。。。已经明示了,访问robots.txt,得到目录/fl0g.php,访问直接拿到flag:cyberpeace{f6c970f5e54f9ddf6964b44b35732dfe} php_rce 这题一打开是一个ThinkPHP的默认界面: 一开始先试了一下,访问一哈404的目录,发现只是返回正常的404界面;然后给主页加一些乱七八糟的参数,返回了错误,错误中泄露了软件版本(后面发现是我蒙中了s参数): 然后呢。。。就没有然后了,找了半天毛都找不到,robots.txt也没有信息。。。 于是百度,发现ThinkPHP 5.x好多版本都有RCE。。。emmm准备后面专门研究一下ThinkPHP的代码,这里先放一个Payload: http://111.198.29.45:41137/index.php?s=index/think\app/invokefunction&function=call_user_func_array&vars[0]=system&vars[1][]=find / -name *flag* 通过这些参数执行了Linux的find指令,找到了flag所在目录/flag,于是执行cat /flag,拿到flag: 当然肯定不止这种解法,就这都任意文件写入了,直接写个马也是没问题的。 参考资料:ThinkPHP5框架缺陷导致远程命令执行、ThinkPHP 5.0.0~5.0.23 RCE 漏洞分析 Web_php_include 源代码已给出: 1 2 3 4 5 6 7 8 9 <?php show_source(__FILE__); echo $_GET['hello']; $page=$_GET['page']; while (strstr($page, "php://")) { $page=str_replace("php://", "", $page); } include($page); ?> 这题好多解法的亚子。。。我想到的就有两种,主要思想就是文件包含和任意命令执行。 双写+php://伪协议 Payload1:?page=PhP://input+POST任意PHP命令 ​ Payload2:?page=PhP://filter/read=convert.base64-encode/resource=fl4gisisish3r3.php,解码拿到flag ...

Mar. 19, 2020 · 8 min · 1665 words · Jiekang Hu

Jarvis OJ WriteUp(Web)

平台链接:https://www.jarvisoj.com/challenges PORT51 题目链接:http://web.jarvisoj.com:32770/ 题目要求使用51端口访问这个网页,于是使用Curl中的--local-port参数即可拿到flag: (查了一下发现也可以通过Socket编程实现,等学完计网编程再来整一个) LOCALHOST 题目链接:http://web.jarvisoj.com:32774/ 提示只能使用localhost地址访问,于是抓包后添加X-Forwarded-For: 127.0.0.1行,提交拿到flag: Login 题目链接:http://web.jarvisoj.com:32772/ 只有一个密码框,抓包发现响应头里面有Hint: Hint: “select * from `admin` where password='".md5($pass,true)."'” 发现md5()函数的第二个参数为true,查询官方文档得知:若第二个参数raw_output设置为true,则返回的是16字节长度的二进制md5数据。所以原理上,只要让md5后的二进制值被解释为字符串后产生注入就可以了。 这里参考了这篇文章的思路:在进行数值比较时,由于MySQL会自动把数字开头的字符串转换成对应的数字,所以尝试让md5后的字符串出现'or'+一个大于0的数字,语句就变为select * from `admin` where password='xxx'or'1xxx',后面的1xxx被自动转换为数字1,变为Bool也就是true了。 当然还可以存在一些变体,如大小写变化和||等,于是一共就有五种情况:'or'、'Or'、'oR'、'OR'和'||'。 于是接下来就可以爆破了。由于数据量太大,百度得到有两个值符合这个要求(以后有时间来爆破一下) content: 129581926211651571912466741651878684928 hex: 06da5430449f8f6f23dfc1276f722738 raw: �T0D��o#��‘or'8 content: ffifdyop hex: 276f722736c95d99e921722cf9ed621c raw: ‘or'6�]��!r,��b 输入这两个值中的一个,得到flag:PCTF{R4w_md5_is_d4ng3rous} ...

Mar. 10, 2020 · 8 min · 1699 words · Jiekang Hu

汇编语言学习笔记

在读《汇编语言》这本书学习汇编语言的时候,在此对每一章的要点进行总结和记录,以便日后复习与查看。 练习环境:Windows 2000 Professional,与书中程序运行环境一致。 第一章 基础知识 汇编语言是一门直接在硬件之上工作的编程语言。由于早期人们使用机器语言(一串二进制数字)进行编程存在不易纠错、晦涩难懂的缺点,所以发明了汇编语言来帮助程序员更高效的编程。汇编语言经编译连接之后可以直接形成由机器指令构成的程序,可以直接被CPU执行。而不同型号的CPU拥有不同的指令集,所以汇编语句对应的机器码可能不尽相同。这本书的汇编语言是基于8086CPU的指令集来进行描述的。 汇编语言包括三个部分: 汇编指令(核心部分):机器码的助记符,有对应的机器码 伪指令:由编译器执行,没有对应的机器码,计算机本身并不执行 其他符号:如+、-、*、/等,由编译器识别,没有对应机器码 汇编语言的指令和数据信息存放在存储器(内存)中。在内存中指令和数据并没有任何区别,本质上都是二进制信息。而决定一段二进制信息是指令还是数据,则由CPU工作时决定。存储器由若干个存储单元构成,单个存储单元的最小单位是字节(Byte,1Byte=8Bit)。 CPU想要进行数据的读写(包括存储器及一些外部器件),必须通过总线,与这些器件进行三类信息的交互(主线逻辑上也分为这三类): 地址信息:CPU首先通过地址总线将要读写的存储单元地址发出 控制信息:随后CPU通过控制总线发送控制命令(内存读/写命令、存储芯片片选命令) 数据信息:再通过数据总线将数据送入对应的存储单元/从对应的存储单元读出数据 一个CPU的地址总线有$N$根,那么可寻址的最多单元数为$2^N$,CPU能够寻址到的所有内存单元构成了这个CPU的内存地址空间;数据总线有$N$根,那么一次性可传输的数据位数为$N$;控制总线的宽度则决定了CPU对外部器件的控制能力。 CPU类型 地址总线宽度 数据总线宽度 寻址能力 一次可传送的数据量 8080 16 8 64KB 1B 8088 20 8 1MB 1B 8086 20 16 1MB 2B 80286 24 16 16MB 2B 80386 32 32 4GB 4B 在一台PC中,装有多个存储器芯片,这些存储器芯片从读写属性上分为RAM和ROM两类。RAM可读可写,但必须带点存储,掉电则内容丢失;ROM只可读不可写,掉电后数据不丢失。从功能上还可以分为三类: RAM:这就是我们平常所说的内存,用于存放CPU使用的绝大部分程序和数据 装有BIOS的ROM:主板和各接口卡均可以有,通过各自的BIOS可以实现基本的输入和输出 各接口卡的RAM:比如显卡上的显存 CPU将上述的所有存储器都当作是内存来看待,所以逻辑上可以将上述的所有存储器映射为一个存储器,也就是CPU的内存地址空间。每个物理存储器在这个逻辑存储器中占有一个地址段,CPU向这个地址段读写数据,就是在向对应的存储器读写数据。所以,我们在基于一个硬件系统编程时,必须要知道这个系统的内存地址空间分配情况。 8086PC的内存地址空间分配情况: 00000H~9FFFFH:主存地址空间(RAM) A0000H~BFFFFH:显存地址空间 C0000H~FFFFFH:各类ROM地址空间 第二章 寄存器 计算机组成原理中有提到:一个计算机系统除了I/O设备外,还有三大部件:运算器、控制器、存储器。其实这三大部件在CPU中也是存在的,它们在CPU中通过CPU内部的总线实现连接和信息传递。 运算器:进行信息处理和运算 控制器:控制各器件进行工作 存储器(寄存器):存储信息 而对于汇编语言来说,CPU中主要的部件就是寄存器。因为程序员可以通过汇编指令来读写寄存器,从而实现对CPU的控制。 不同的CPU寄存器的个数和结构也不尽相同。8086CPU中有14个寄存器,分别为:AX、BX、CX、DX、SI、DI、SP、BP、IP、CS、SS、DS、ES、PSW。8086CPU中所有的寄存器都是16位(2B)的。 ...

Feb. 20, 2020 · 12 min · 2517 words · Jiekang Hu

Git初探

昨天花了两个小时,把廖雪峰老师的Git教程看了一遍,然后再根据网上的一些资料,对Git的一些概念和常用命令做一个归纳。 Git是什么? Git是一个开源的分布式版本管理系统,由Linux之父Linus开发。相比于其他集中式版本管理系统(如SVN、CVS)将整个项目的抓取和提交过程集中在一台中心服务器中,Git中对项目提交修改的每一个开发者都具有一套完整的项目版本库,中心服务器也不再是项目开发的必须项(为了方便提交,很多时候依然会为Git设置中心服务器),开发者在本地对项目进行修改和开发,并将修改提交给其他开发者,其他开发者也各自将自己做的修改提交给其他人,这样就实现了实时的版本管理和修改提交。 常见的应用了Git的网站有Github、Gitee、Gitlab等,它们为开源项目提供免费的Git存储,开发团队可以使用它们来实现版本管理和团队协作。 一些概念 仓库 / 版本库(Repository) 仓库指的是受版本控制管理的文件目录,该目录下的所有文件都受Git的管理,能够查询变更、删除等记录。 工作区(Working tree) 工作区中包含了仓库的工作文件。开发者对工作区的文件进行修改和增删,使用git add命令将修改添加至暂存区,然后使用git commit命令将暂存区的修改提交至仓库。 暂存区(Staging area, 又称Index) 暂存区是工作区用来提交更改(commit)前可以暂存工作区的变化。使用git add命令将修改添加至暂存区。 上面三者之间的联系: 1 [工作区] >>git add>> [暂存区] >>git commit>> [仓库] 头(HEAD) 头是一个象征性的参考,最常用以指向当前选择的分支,同时头也可以指向某个特定的版本。 签出(Checkout) 从仓库中将文件的最新修订版本复制到工作空间。使用git checkout命令,既可以指定特定的版本,也可以指定HEAD指针所在的版本。 分支(Branch) 从主线上分离开的副本,通常对项目的不同功能、不同情况下的开发,需要创建对应的不同的分支。默认分支叫master。 标记(Tags) 标记指的是某个分支某个特定时间点的状态。通过标记,可以很方便的切换到标记时的状态,也可以使用标记来标识某个版本。 常见命令 git init [directory]:在目录directory生成一个Git仓库(--bare参数用于创建一个裸仓库) git add <filename> ...:添加文件,并将修改提交到暂存区 git rm <filename> ...:删除文件,并将修改提交到暂存区 git commit -m <massage>:将暂存区的修改提交到仓库(git commit --allow-empty-message -m ''用于不带message的提交,但不推荐使用) git status:查看当前状态 git diff <filename>:查看当前工作区中文件和暂存区中对应文件的区别 git diff HEAD -- <filename>:查看当前工作区中文件和仓库中对应文件的区别 git log:查看提交历史(--pretty=oneline参数用于美化显示为每条记录一行、--graph参数使数据以图表形式展示) git reflog:查看命令历史 git reset:回退到之前的某个版本(将HEAD指针指向某个版本,之后的所有版本都被删除)(--hard参数同时会清除暂存区和工作区的修改) 用法:git reset 0f4a(版本对应的SHA1值)、git reset HEAD^(相对位置)、git reset master~3(数字表示的相对位置)后面可加文件名仅回退指定文件。 git reset HEAD <filename>:撤销暂存区的修改至工作区 git revert -n <commit>:撤销某一版本对当前版本的修改,并基于此生成一个新的版本(具体和git reset的区别参见这篇文章) git restore --staged <filename>:撤销暂存区的修改至工作区 git checkout -- <filename>:撤销工作区某文件的修改 git restore <filename>:撤销工作区某文件的修改 git checkout <branch>:切换到特定的分支(-b参数表示创建后切换) git switch <branch>:切换到特定的分支 git remote add <name> <url>:添加一个名为name的远程仓库 git push <name> <branch>:将本地仓库的数据推送到远程仓库上(-u用于建立上游引用,将远程仓库和本地仓库关联起来) git pull:从远程仓库抓取数据 git clone <url>:从远程仓库克隆数据至本地 git branch:查看所有分支 git branch <branch>:创建一个分支 git branch -d <branch>:删除一个分支(-D强制删除) git switch -c <branch>:创建一个分支并切换至该分支 git merge:以Fast-Forward模式合并分支(--no-ff参数用于禁用Fast-Forward模式,两者的区别如下图) git stash:储存当时工作目录的状态(保护现场) git stash list:查看所有的stash内容 git stash apply <stash>:恢复某个stash(stash内容保留) git stash drop <stash>:删除某个stash git stash pop <stash>:恢复某个stash并删除 git cherry-pick <commit>:应用某些现有提交引入的更改 git rebase:8太懂,贴一个链接慢慢琢磨https://www.jianshu.com/p/f7ed3dd0d2d8 git tag <tagname>:用于新建一个标签,默认为HEAD,也可指定一个commit id git tag -a <tagname> -m <message>:指定标签信息 git tag -d <tagname>:删除一个本地标签 git tag:查看所有标签 git show <tagname>:查看某个标签的信息 git push origin <tagname>:推送一个本地标签至远程仓库 git push origin --tags:推送所有未推送过的本地标签至远程仓库 git push origin :refs/tags/<tagname>:删除一个远程标签 git config --global user.name "Your Name"、git config --global user.email "email@example.com"设置全局的用户名和邮箱 git config --global alias.<alias> <command>:为命令定制别名 使用.gitignore文件来忽略某些特殊文件的提交https://github.com/github/gitignore;git add -f来强制提交被忽略的文件 全局配置文件路径:/.git/config;当前用户配置文件路径:~/.gitconfig 参考资料 Git分支模型 A successful Git branching model Git Documentation Git教程 - 廖雪峰的官方网站 Learn Git Branching CS Visualized: Useful Git Commands CS Visualized: Useful Git Commands(中文版)

Feb. 16, 2020 · 2 min · 232 words · Jiekang Hu

DVWA练习记录(三)

SQL Injection(Blind)(SQL盲注) SQL盲注与一般注入的区别在于,一般的注入攻击者可以直接从页面上看到注入语句的执行结果,而盲注时攻击者通常是无法从显示页面上获取执行结果,甚至连注入语句是否执行都无从得知,因此盲注的难度要比一般注入高。目前网络上现存的SQL注入漏洞大多是SQL盲注。 这篇文章总结了常见的SQL盲注场景: 提交一个导致SQL查询无效时,会返回一个通用错误页面,提交正确则会返回一个内容可被适度控制的页面。 提交一个导致SQL查询无效时,会返回一个通用错误页面,提交正确则会返回一个内容不可控的页面。 提交受损或不正确的SQL既不会产生错误页面,也不会以任何方式影响页面输出。 举一个很形象的例子:有一个机器人,它对于问题只会回答“是”或“不是”,而盲注的目的就是通过问机器人一些问题,根据它返回的结果来判断出我们想要的数据内容。 安全等级Low 界面和一般SQL注入的界面一致,只是输入正确的ID会返回ID存在,而输入错误的ID则会返回ID不存在,不再会返回实际内容: 首先判断能否注入: 输入1' #,返回存在,说明没有报错,存在字符型注入。 接下来猜解用户名和当前数据库名。 这里可以使用基于布尔的盲注和基于时间的盲注两个办法。 基于布尔的盲注就是通过substr()、length()等函数,去查询字段长度、查询字段的每个字符是否为指定值,根据数据库返回的结果确定字段的值。 比如,我们可以问机器人:“数据库名称的长度是4吗?”,“数据库名称的第3个字符是a吗?”,“数据库里面一共有3个表对吗?”类似于这样的问题,就可以逐步判断出数据库的名称以及一些其他的信息。 1 2 3 SELECT first_name, last_name FROM users WHERE user_id = '1' and length(database())=4#'; /* 数据库名称的长度是4吗? */ SELECT first_name, last_name FROM users WHERE user_id = '1' and substr(database(),3,1)='a'#'; /* 数据库名称的第3个字符是a吗? */ SELECT first_name, last_name FROM users WHERE user_id = '1' and (select count(table_name) from information_schema.tables where table_schema=database())=3#'; /* 数据库里面一共有3个表对吗? */ 基于时间的盲注就是借助if条件和sleep()函数,若满足某个条件就延时,反之直接返回。这样就可以通过页面的响应时间来判断条件是否满足。 ...

Feb. 9, 2020 · 18 min · 3674 words · Jiekang Hu

DVWA练习记录(二)

Brute Force(暴力破解) 暴力破解指的是黑客使用穷举法猜解出用户口令,是最为广泛使用的手法之一。在很多情况下,用户会使用不安全的、很容易被猜解的密码,使得这种攻击变得可能。为了提高猜解的成功率,黑客往往还会与社会工程学结合,从不同渠道获取用户的相关信息,如生日、姓名等可能用来作为密码的信息,再基于这些信息构建字典,将其任意组合对密码进行猜解。 理论上说,若网站对口令输入的尝试次数为无限的话,使用穷举法猜解密码总能够成功。所以需要网站进行一定的限制,如多次输入错误限制输入等。 DVWA给出的是一个登录的界面,若登录成功则提示进入受保护区域: 安全等级Low 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 <?php if( isset( $_GET[ 'Login' ] ) ) { // Get username $user = $_GET[ 'username' ]; // Get password $pass = $_GET[ 'password' ]; $pass = md5( $pass ); // Check the database $query = "SELECT * FROM `users` WHERE user = '$user' AND password = '$pass';"; $result = mysqli_query($GLOBALS["___mysqli_ston"], $query ) or die( '<pre>' . ((is_object($GLOBALS["___mysqli_ston"])) ? mysqli_error($GLOBALS["___mysqli_ston"]) : (($___mysqli_res = mysqli_connect_error()) ? $___mysqli_res : false)) . '</pre>' ); if( $result && mysqli_num_rows( $result ) == 1 ) { // Get users details $row = mysqli_fetch_assoc( $result ); $avatar = $row["avatar"]; // Login successful echo "<p>Welcome to the password protected area {$user}</p>"; echo "<img src=\"/DVWA{$avatar}\" />"; } else { // Login failed echo "<pre><br />Username and/or password incorrect.</pre>"; } ((is_null($___mysqli_res = mysqli_close($GLOBALS["___mysqli_ston"]))) ? false : $___mysqli_res); } ?> 从源代码中可以看出,首先SQL语句没有做任何的注入防护,所以可以直接SQL注入登录,Payload:http://127.0.0.1/DVWA/vulnerabilities/brute/?username=admin'#&password=whatever&Login=Login# 其次,输入框是可以进行无限次尝试的,所以也可以进行暴力破解,这里使用Burpsuite中的Intruder模块进行爆破。 ...

Feb. 7, 2020 · 16 min · 3408 words · Jiekang Hu

DVWA练习记录(一)

简介 Damn Vulnerable Web Application (DVWA) is a PHP/MySQL web application that is damn vulnerable. Its main goal is to be an aid for security professionals to test their skills and tools in a legal environment, help web developers better understand the processes of securing web applications and to aid both students & teachers to learn about web application security in a controlled class room environment.The aim of DVWA is to practice some of the most common web vulnerabilities, with various levels of difficultly, with a simple straightforward interface. DVWA是一个用来进行安全脆弱性鉴定的PHP/MySQL Web应用程序。其主要目标是帮助安全专业人员在合法的环境中测试他们的技能和工具,帮助Web开发人员更好地理解保护Web应用程序的过程,并帮助学生和教师学习Web应用程序安全性。DVWA的目的是通过一个简单易用的界面从不同的难易程度来体现一些最常见的Web漏洞。 ...

Feb. 5, 2020 · 14 min · 2910 words · Jiekang Hu