单字节穷举

前言

穷举是做任何题都最简单的方法
但考虑输入为任意字符串,则穷举空间就有95len(95是常见可见字符的数量),随便一个flag长度为几十就会导致计算时间突破天际

所以一般情况下不会考虑穷举
但当题目具备一些特殊情况时就可以通过一些手段来降低穷举空间到可以接受的大小

最简单的情况当然就是程序每接收一个字符都会做出反馈
攻击者只需要穷举91*len次即可得到正解,即将穷举空间从几何级降低到算术级

虽然通常情况下不会出现这种程序,但有些题目会具备这样的性质
例如memcmp的实现

for(i=0;i<len;i++)
{if(src[i]!=dst[i])return 0;return 1;
}

当程序逐字符检查到某个字节不同时将会break,使得程序执行产生不同
而通过一些手段,我们可以捕获到这些不同
这些手段就称之为侧信道攻击

例如记录程序执行时间、执行条数等等

方法

Pintools

标准的侧信道攻击可以利用现成的轮子,pintools来记录程序执行的指令条数
pintools是微软开发的一款插桩工具,自带的例程当中就有这个模块,被用来做这个实际上跟z3一样属于大材小用了233

具体代码可以见我之前的博客Windows、Linux
这两篇是最早的使用,介绍的相对详细一些,但实现的也比较粗糙
例如有的题目中会对长度先行校验,因此脚本当中应对此也有特殊设计
不过我找不到啦(°∀°)ノ所以凑活着看吧蛤蛤蛤

突然想起来还有真·轮子
比较完善的,从长度到输入依次攻击的工具

Hook

原理相同,事实上Pintools只是一种特殊的Hook框架,因此使用其他的Hook框架也是可以完成的
同样的Pintools也是可以自己编写模块来达成功能的
(没提供题目文件的)例题:SUCTF-Enigma
我习惯使用Frida所以用的这个框架

API_Hook

只是Hook的特殊情况~针对库函数的操作可以通过LD_PRELOAD来劫持libc中的函数,例如memcmp, strcmp等
由于说到底我们只是想知道变换后的输入(和结果的比较情况),因此可以通过这种方法劫持比较的函数获取比较情况
Enigma的比较是通过memcmp实现的,所以可以用这个方法~
甚至还有更简单的操作,直接仅令它比较一个字节,从而令其还原回我们前言中所说最简单的情况
eg:

#include <stdio.h>
int memcmp(char* a1, char* a2, int len)
{/*for(int i=0;i<len;i++){printf("%x ", a1[i]);}*/FILE* fd;int input;fd = fopen("./index", "r");input = getc(fd);input = atoi(&input);printf("check %x \n",input);return a1[input]!=a2[input];
}

这样就可以通过index内的内容控制memcmp比较的下标了
同时也可以将内存全部打出来

不过这样可能会影响别的地方的调用,可能会造成一些数据错误233比方说从截图上可以看到在打印banner的时候也用对memcmp的调用,所幸似乎不影响

引申

如前所述,我们只是想获知变换后的输入(和结果的比较情况)以此降低穷举空间的大小
因此任何可以有助于此的方法都可以使用
包括其他可以获取内存或比较情况的方法~

而使用这种方法的前提条件是不存在雪崩效应,或者说雪崩效应不能太厉害,即修改一个字节的输入所影响的输出串(我称之为操作单位)不能太高
例如操作单位为Int,即4个字节,可以降低大小到(954)*(len/4),也还算可以接受的穷举空间
比方说base64XD

190320 逆向-单字节穷举相关推荐

  1. java获取数组穷举_被BAT疯抢的Java工程师,都是怎么拿到年薪50W的offer

    怎样学习才能从一名Java初级程序员成长为一名合格的架构师,或者说一名遭到BAT疯抢的架构师. 那么遭到BAT疯抢的架构师应该有怎样的技术知识体系,这不仅是一个刚刚踏入职场的初级程序员也是工作三五年之 ...

  2. jsp input输入实时校验长度并提示_HotCRC未公开发布的高版本穷举输入规则(V3.02)...

    HotCRC未公开发布的高版本穷举输入规则(V3.02): text ?poly-poly #init-init ^xor-xor $CRC4~64LlRr?poly#init:code,%*Nn(i ...

  3. 《数据科学家养成手册》第十一章------算法学1(穷举,分治,回溯,贪心,迭代)

    1.对于计算机学科的人员,无论是怎么样子的工作都是需要了解算法的-----从而获得解决日常问题的基本的思路 2.计算机底层的数理计算逻辑仍然是"与""或"&qu ...

  4. 快速穷举TCP连接欺骗攻击-利用SYN Cookies

    摘要   TCP 利用 32比特的 Seq/Ack 序列号来确认每一个连接的可靠性. 此外, 这些32位的序列号还能保证服务器不会被会话劫持,伪造一个服务器发出的初始序列号(ISN) 是个难以实现的技 ...

  5. 算法设计之—直接 遍历/穷举法、贪心算法、动态规划、回溯法、EM方法

    算法是对完成特定问题的程序执行序列描述,表象为从问题初始状态到问题结束状态的所有路径之中寻找可行路径,若无先验经验,根据执行方式不同可以划分为无规则和有规则(启发式)方法. 无规则方法为穷举,改进方法 ...

  6. 【算法】蛮力法/穷举法/枚举法 的基本问题分析

    炮兵问题的优化,设立逻辑数组 蛮力法设计思想 有策略地穷举 + 验证 制定穷举策略 避免重复 简单来说,就是列举问题所有可能的解,然后去看看是否满足题目要求,是一种逆向解题方式.(我也不知道答案是什么 ...

  7. 用vc++穷举windows应用程序密码

    一.引言 随着计算机信息技术的发展,人们越来越重视信息的安全性,信息数据的安全保密已经成为影响计算机发展的一个重要课题.机密文件.商业情报.银行账号.网络密码.科技成果.包括私人信件等等,都成了用户为 ...

  8. 用vc++穷举windows应用程序密码(上)

    2007年10月12日 02:14:00 一.引言 随着计算机信息技术的发展,人们越来越重视信息的安全性,信息数据的安全保密已经成为影响计算机发展的一个重要课题.机密文件.商业情报.银行账号.网络密码 ...

  9. 百鸡问题用计算机什么法解决,《穷举法解决问题》教学设计

    一.教学目标 1.知识与技能 ⑴了解穷举法的基本概念及用穷举法设计算法的基本过程. ⑵分析建立正确的数学模型,归纳穷举法穷举技巧. ⑶能够根据具体问题的要求,使用穷举法设计算法,编写程序求解问题. 2 ...

最新文章

  1. OAuth2.0 基础概述
  2. java add offer_图解Java中的5大队列!(干货收藏)
  3. [论文收集] ICSOC 2008 论文
  4. string的常见用法详解
  5. 20100422.C#.const VS readonly
  6. mysql设置最大连接数为200_设置mysql最大连接数的方法
  7. 大学物理实验试卷1到8_试卷赠送199:七年级秋季学期期中检测地理试卷及答案...
  8. 美图秀秀首页界面按钮设计(二)
  9. Spring MVC集成slf4j-logback
  10. ES6-symbol-创建symbol
  11. 处理接口超时_架构设计 | 接口幂等性原则,防重复提交Token管理
  12. [日志]挂在树上的茶壶
  13. 用C#实现基于TCP协议的网络通讯(2)
  14. 读一本自己心爱的书,冒什么风险都是值得的
  15. 动态规划——最大连续子序列和
  16. 基于springboot+dubbo微服务开发的商城系统
  17. 二叉树输出(凹入表示法)
  18. Kali2019安装ShuiZe|水泽-自动化信息收集工具安装
  19. 基于Redis的频次控制能力实现
  20. 富士胶片 激光一体机 ApeosPort 3410SD安装配置心得

热门文章

  1. 动态规划:5627、石子游戏VII
  2. 商场积分体系设计 购物中心会员管理系统
  3. subList 截取数组 前10个
  4. 程序员的一生,从那个高考的夏天开始......
  5. mysql HOUR_OF_DAY: 0 -> 1
  6. 使用Bert进行文本分类(立场检测)
  7. 刷爆外网!中国天才设计师火到日本,30 张神仙海报看完真的服!
  8. tun/tap 驱动
  9. 《How to read a book》 书评和资源
  10. CSS实战:CSS实现折扇效果(可以表白哦)