D:+++++++++\2018.8.7比赛\cracking_game

查看二进制码,发现是个ELF文件,先放到Linux环境运行一波,首先给权限chmod 777 cracking_game

发现回车之后还让我们输入,接着输,完了之后,还让输,直到三段之后,输出了Hmm…

由此最后可能有三个key,或者flag由三段组成

我们看一下他开了什么保护:checksec cracking_game

我去全开了,第一次遇见,平常都是有一个NX保护,我们先用ida静态看一下反编译的代码

到这里看到了flag的标志,果然是由三段组成的,点击进去看看代码:

果然,那么多保护不是白开的,反编译不了,凉了一半,有没有,打破了往常做题的一贯套路,那怎么办呢?看汇编代码呗

找到了关键的汇编代码:

分析,找到了关键的输入函数,在call 函数之前,参数先由右往左进栈,所以var_20为参数1,var20为参数2,var20为参数3

再输入函数下面分别将这三个参数(输入的flag)地址给了寄存器eax ebx edx,我们刚才说了var_28为参数1,先看参数1都进行了什么操作,

可以看到又将eax+376DA237地址给了esi,之后就关注esi寄存器做了什么操作

可以看到黄条的都是对esi寄存器做的修改,异或,加,

发现只要ecx不为0,就会跳转到Hmm的地方,那么只要保证ecx==0就行了,现在思路理清了,第一段key,经过一系列运算,最后让ecx==0,我们可以根据汇编代码写出来破解脚本

脚本有两种写法:1 逆向推理 2 爆破

发现逆向推理会有溢出现象,我们选择爆破的方式:

爆破首先要确定爆破的范围,其次是爆破需要的条件,由于ecx是32位寄存器,所以爆破范围0xffffffff,每一步加上与0xffffffff相与,是因为在加的过程中会出现比32位大的高位,在程序32位寄存器中会丢弃,所以每一步和0xffffffff相与:

注:由于爆破范围太大,可以把一层循环的32位0xffffffff分成两层循环,一层八位0xff,二层24位0xffffff,二层循环做左移位,然后和一层相或,这样可以将二层循环的高两位剔除,换成一层循环的低两位,会快一点,也可以用一层循环,但是每次都要改循环范围,逐步缩小,这样的话必须一段一段来爆破了,很麻烦,也有可能会错失key

bool_flag=0
for j in range(0xff):for i in range(0xffffff):if((((((((((((i<<8)|j)&0xffffffff)+0x376DA237)&0xffffffff)^0x5039B3AD)+0x197C0136)&0xffffffff)^0x1363F241)-0x74D86A5E)&0xffffffff)==0):print ("eax=key[0]="+hex((i<<8)|j))bool_flag=1breakif bool_flag==1:break

按照汇编可以写出第一部分的脚本

第二、三部分跟第一部分程序一样,最终的脚本:

bool_flag=0
for j in range(0xff):for i in range(0xffffff):if((((((((((((i<<8)|j)&0xffffffff)+0x376DA237)&0xffffffff)^0x5039B3AD)+0x197C0136)&0xffffffff)^0x1363F241)-0x74D86A5E)&0xffffffff)==0):print ("eax=key[0]="+hex((i<<8)|j))bool_flag=1breakif bool_flag==1:break
#eax=0xe698830d
bool_flag=0
for j in range(0xff):for i in range(0xffffff):if(((((((((((((((((((((((((((((((((i<<8)|j)&0xffffffff)+0x5A46BABC)&0xffffffff)^0x58E7773A)-0x3617A80B)&0xffffffff)^0x74A4134B)+0x4D6F9F5A)&0xffffffff)^0x2A3457E6)+0x4B8BF8B9)&0xffffffff)^0x0BB5D6AFF)+0x3EB308B5)&0xffffffff)^ 0x3C5A9BE1)-0x4EF22DAE)&0xffffffff)^0x9D91B40F)-0x42596E22)&0xffffffff)^0x5D8ACD6E)+0x57794904)&0xffffffff)^0x481EE77)-0x2CF219D2)&0xffffffff)^0x5702EC35)+0x67B243DF)&0xffffffff)^0x80CAFC7B==0):print ("ebx=key[1]="+hex((i<<8)|j))bool_flag = 1breakif bool_flag==1:break
#ebx=0x8dd70651
bool_flag=0
for j in range(0xff):for i in range(0xffffff):if(((((((((((((((((((((((((((((((i<<8)|j)&0xffffffff)^0x63074EB7)-0x0F5DED87)&0xffffffff)^0x3D898713)-0x1EBAD7B8)&0xffffffff)^0x0D4A1204D)-0x126E5E14)&0xffffffff)^0x0DB034E6B)-0x68C8F0D3)&0xffffffff)^0x85AEAF52)+0x20E21188)&0xffffffff)^0x0CDC4D471)+0x6492A3E9)&0xffffffff)^0x5BF4CECF)+0x28EF6935)&0xffffffff)^0x97C13118)-0x7624D9FB)&0xffffffff)^0x5B589A)+0x64B87E0E)&0xffffffff)^0x0DF2FFB19==0):print ("edx=key[2]="+hex((i<<8)|j))bool_flag = 1breakif bool_flag==1:break
#edx=0xc1ecd292

由于爆破的范围有点大,所以程序运行很长时间才有结果,大概运行了有一个小时,是不是很扯^_^

你的支持是我最大的动力!

支付宝
微信

cracking_game相关推荐

  1. cracking_game逆向分析

    cracking_game 载入IDA Shift + f12  双击Bingo!.... 双击通过Xref查找引用Bingo处(sub_4E0) 接着按下空格  切换成文本模式 那个应该是堆栈不平衡 ...

最新文章

  1. linux查看当前的工作目录,Linux-查看当前工作目录(pwd)
  2. SQL Server 2008 远程过程调用失败
  3. python怎么获取时间_Python:如何从datetime.timedelta对象中获取时间?
  4. 1.9编程基础之顺序查找 01查找特定的值
  5. android 自动化测试之monkeyrunner学习(三),自动化测试之Monkeyrunner
  6. mysql redis教程_MySQL redis学习与应用
  7. 一位女生写的追MM秘计
  8. 飞书推出“线上办公室” 通过实时语音频道还原办公场景
  9. 理解metrics.classification_report
  10. 【割点】【割边】tarjan
  11. ajxa TypeError: $.ajax is not a function
  12. 【Redis总结-基础入门】
  13. Boost基础篇——安装
  14. Eclipse设置运行内存大小
  15. 二十九、K8s最小服务漏洞3-gVisor沙箱
  16. 左神算法中级班第三课[C++代码]
  17. JetBrains 学生认证教程(Pycharm,IDEA… 等学生认证教程)
  18. SpringBoot之从零搭建博客网站
  19. 计算机二级c语言程序填空,计算机二级C语言题库之程序填空.docx
  20. Android 编程好书推荐

热门文章

  1. Android Studio 报错:No variants found for ‘app‘
  2. ChaosBlade学习
  3. 如果你是滴滴的产品经理,你会怎么做
  4. cdn.bootcss.com挂了。国内访问不到,怎么办?
  5. 用于可靠的钙钛矿薄膜瞬时光致发光模拟的拟合程序
  6. PHPword 导出word设置不同样式
  7. 二维海浪波数谱的matlab,基于波数谱的风涌分离算法研究
  8. Button 设置ForeColor不生效问题
  9. 神武——梦幻经济模式
  10. 手把手教你分析韵达快递问题件