东欧赌场
东欧赌场 关于我们 业务领域 新闻中心 在线留言 联系我们
 

联系我们

网址: 东欧赌场

地址: 东莞市高埗镇振兴北路华宏西街1号

 

radare2逆向学习笔记




作者:东欧赌场     发布时间:2020-11-11 14:07

  最近刚开始学习逆向(Reverse Engineering), 发现其学习曲线也是挺陡峭的, 而网上的 许多writeup文章主旨总结就六个字:你们看我屌吗? 几近炫技而对初学者不太友好. 所以我打算以初学者的身

  最近刚开始学习逆向(Reverse Engineering), 发现其学习曲线也是挺陡峭的, 而网上的 许多writeup文章主旨总结就六个字:”你们看我屌吗?” 几近炫技而对初学者不太友好. 所以我打算以初学者的身份来写写自己从入门到深入的经历.

  当前许多逆向的writeup倾向于使用IDA-Pro, 而且似乎都依赖于F5(反编译的快捷键), 直接 从二进制文件转成了可读的C代码. 这对于实际工作来说也许是个捷径, 但对于学习来说却 没什么好处. 所以本文逆向采用了另一个开源的(但也同样强大的)二进制分析工具Radare2. 如果你是个资深的逆向人员, 那么从本文也可以了解下radare2的一些功能.

  逆向软件的时候往往面对的是汇编代码, 所以对于指令集要有个大致的认识, 另外对于一些 模式(pattern), 比如函数入口(prologue), 出口(epilogue)和函数调用约定(calling convention) 等也要有所了解. 关于这类知识可以将RE4B(Reverse Engineering for Beginners)这本书作为参考. 书虽然比较厚, 但比较全面, 包括了X86/ARM/MIPS的内容和许多有趣的历史典故, 一开始可以粗略扫一遍, 遇到问题再回头仔细阅读相关部分即可.

  当了解了基本汇编知识后(目前x86足矣), 就可以开始准备工具了. 说起工具我想起了一个寓言:

  年轻人学有所成, 出山前问师父: “我准备练习武器, 请问哪种武器能让我战无不胜呢?” 师父说: “武器? 如果你的武器比你的头脑更加锋利, 那你将一无是处”.

  无论何时, 个人的头脑和思维永远是最重要的, 而武器只是工具, 永远不要让工具取代了你的思考. 当然也不是要你肉眼反汇编, 总之你懂就行了! 我在Linux环境工作, 用到的几个工具如下:

  初步打算是这一系列逆向文章使用IOLI的crackme文件来作为目标, 总共3个平台(Linux/Win32和Arm), 每个平台有10个二进制文件, 都是从同样的源码编译而来的. 可以从radare的git上下载.

  rabin2是radare2套件中的一个工具, 主要用来提取二进制文件中的信息, 输出如下:

  看样子是要输入密码, 从rabin2的字符串输出里看到250382也许就是密码, 我们可以输入试试:

  好吧! 看样子确实是. 毕竟是第一关, 有点简单了. 但我还是先假装不知道吧:) 如果目的是进入到Password OK分支, 那么我们可以有多种解法, 如分析密码的算法, 修改原文件(打patch), 利用漏洞, fuzzy等, 下面挑几个说说.

  进入后自动跳转到了函数入口0x08048360, 然后用pdf命令来查看汇编代码:

  pdf表示p(打印)d(反汇编)f(函数), @表示取地址, sym.main为函数符号, 也可以用十六进制整数地址表示. 在r2中查看这些指令的帮助只要在后面输入?即可, 比如p?查看打印类的命令,pd?查看打印反汇编类的命令.

  一个典型的32位Linux程序, 这时候要想起函数的调用约定是通过栈来传参, 如果忘了可以再看看RE4B哦. 看到main函数的汇编代码了, 就开始分析了, 我不想像一些文章那样贴个图就说”显而易见, 这里的作用是XXX”, 毕竟我也只是个新手, 虽然这只是一个超简单的crackme, 但因为是第一次, 我还是把流程完整地走一遍.

  有了汇编接下来就开始分析了, r2和IDA一样可以自己写注释和修改变量名称, 在此之前我们先创建一个工程, 以保存这些修改:

  这条指令的意思是保存一个名为ioli0x00的(新)项目, 通常默认保存在里.

  以P开头的命令是项目工程管理相关(Project managment), 还记得之前说的吗, 如果不记得命令, 可以通过P?来查看帮助.

  那么local_18h应该就是用户输入的字符串了, 我们先给他们改个好听的名字:

  afv-表示删除某个名字, 这里删除了local_4h因为它其实不是本地变量, 这时再次打印汇编就能看到改好的名字了:

  由前面的sub esp, 0x28可知, 这里的N应该小于40(没错! 这里有一个栈溢出漏洞!). 不过对于函数 prologue之后的几条汇编我还不是很明白作用是是啥, 希望有大神能告知一下~

  至此, crackme0x00的分析基本完成. 虽然有些步骤看起来很繁琐, 但对于分析大型项目还是很有用的. 尤其是给变量/参数命名, 给函数/代码块命名, 这样会使得分析过程步步为营, 柳暗花明.

  当我们能直接接触程序并且有修改权限时, 那么修改该二进制文件也是个快速通关的好办法! 回到刚刚的汇编输出, 我们看到0x08048470这行有一个跳转分支:

  -w参数表示以可写的方式打开程序, 而之前我们的打开方式是只读滴! 或者在之前的会线] eval cfg.write=true

  ?哦,px?和wx?都能查看对应的帮助.OK现在改好了, 退出r2, 再运行下试试:

  可以看到NX是开着的, 但是很幸运, ASLR没有开, 不过就算开了并不影响这节的示例, 结尾会说原因. 刚刚bash脚本的输出告诉我们输入长为29字节的时候程序就崩溃了, 那么猜测29字节开始就覆盖了EIP, 但毕竟是猜测, 二进制的世界不接受模棱两可的答案!首先生成一组De Bruijn模式的序列, 目的只是为了在溢出时候确认位置, 你用自己的方法也可以, 这里用

  还记得解法2时要跳转到正确分支的地址吗? 不错就是0x08048480, 来试试呗, 注意字节序哦:

  成功执行了打印”Password OK”的分支, 但还是有点不完美, 因为最后没有清理好现场, 不过这足以说明我们 能够掌控执行流程了! 一个优雅的exploit在劫持控制流程后还应该优雅退出, 而为了执行更多函数, 比如

  等, 就需要知道 libc的(基)地址, 这里ASLR没开所以很容易获得所有libc函数的地址, 利用ROP链就能做任何你想做的事, 这里就不深入了!

  解法4: 利用Fuzzy这个方法综合了上述的一些方式, 我们可以用暴力破解的方式来获取密码, 也可以利用afl或者libFuzzer 来自动化找出该程序潜在的bug(配合QEMU). 这种方式的坏处是太暴力了, 让妹子不敢靠近(逃); 好处 则是在一定程度上解放了大脑, 用计算机来帮我们计算, 算力越强就越有可能找到突破点!

  本来是想多写几个crackme的, 但是由于这是第一篇, 就讲详细一点, 以后会深入一些更复杂和的程序, 写几篇真正意义上的writeup. 总结一下求解crackme类问题的方法, 1)逆向分析, 2)修改程序, 3)利用漏洞, 4)利用Fuzzy. 通常我们在遇到实际问题时是会将这些方式结合起来用的, 比如虽然逆向分析了一部分代码, 但某部分算法特别复杂, 那么就会借用Fuzzy的思想, 对这部分逻辑进行Symbolic Execution, 以最快的方式解决战斗!

  上一篇:魔豆全网小程序系统平台简介下一篇:阿里云停了码云的域名解析??!!

东欧赌场



  • 上一篇:一、 Windows消息机制流程
  • 下一篇:保时�?11将进行中期改�?或配涡轮发动机
  •  
    24小时咨询热线:
    东欧赌场 关于我们 业务领域 新闻中心 在线留言 联系我们 网站地图
     
     
    手机:  地址:东莞市高埗镇振兴北路华宏西街1号
    ©2018 东莞市天发物流公司 版权所有京ICP备10013901号