前言


本文由 本人 首发于 先知安全技术社区: https://xianzhi.aliyun.com/forum/user/5274


前文讲了一些 radare2 的特性相关的操作方法。本文以一个 crackme 来具体介绍下 radare2 的使用

程序的地址: 在这里

正文

首先使用 radare2 加载该程序。使用了 aaa 分析了程序中的所有函数。使用 iI 查看二进制文件的信息。可以看到是 32 位的。

使用 aaa分析完程序后,可以使用 afl 查看所有的函数。

直接跳到 main 函数看看逻辑

不习惯看文本模式的汇编的话,可以使用 VV 进入图形化模式

拿到个程序,我会首先看函数调用理解程序的大概流程。比如这里先调用了 printf 打印了一些提示信息,然后使用 scanf 获取我们的输入,分析 scanf的参数

|           0x080484cc      8d45fc         lea eax, [local_4h]
| 0x080484cf 89442404 mov dword [local_4h_2], eax
| 0x080484d3 c70424348604. mov dword [esp], 0x8048634 ; [0x8048634:4]=0x6425
| 0x080484da e851feffff call sym.imp.scanf ; int scanf(const char *format)

我们可以知道0x8048634 是我们的第一个参数, local_4h是我们的第二个参数。看看 0x8048634 存放的是什么。

所以程序需要我们输入的是一个 整数,然后把它存在 local_4h里面了。那我们就可以把 local_4h 变量改下名字。这里改成 input

继续往下看发现 input 变量后来没有被处理直接传到了 test 函数。他的第二个参数是这样生成的

为了获得这个参数我们有很多方法,比如 我们可以直接静态分析,或者用 gdb 调试这都很容易得到结果。

这里正好试试 radare 的模拟执行功能。使用该功能我们需要先分析要模拟执行的代码对环境的依赖,比如寄存器的值,内存的值等,然后根据依赖关系修改内存和寄存器的值来满足代码运行的上下文。

在这里这段代码只对栈的内存进行了处理。那我们就先分配一块内存,然后用 esp 刚刚分配的内存。由于这里一开始没有对内存数据进行读取,所以我们直接使用分配的内存就好,不用对他进行处理。

首先我们跳到目标地址,然后使用 aei 或者 aeip 初始化虚拟机堆栈,然后使用 aer 查看寄存器状态。

然后分配一块内存作为栈内存,给程序模拟执行用。

0xff0000 分配了 0x40000 大小的内存。然后把 espebp 指到这块内存里面。

然后我们让模拟器运行到 0x0804850c 也就是调用 test 函数的位置处,查看他的参数,可以看到第二个参数的值就是 0x00052b24

最后我们进去 test 函数里面看看

就是判断 参数一参数二 是否一致,所以这个 crackmekey 就是 0x00052b24 十进制数表示 338724.

成功

总结

radare2 的模拟执行功能是通过 esil 来实现的,粗略的试了一下感觉还是挺不错的感觉和 unicorn 有的一拼,不过radare2也是有 unicorn的插件的。

参考:

http://radare.org/r/talks.html

https://github.com/radare/radare2book

https://codeload.github.com/radareorg/r2con/

一步一步pwn路由器之radare2使用实战的更多相关文章

  1. 一步一步pwn路由器之rop技术实战

    前言 本文由 本人 首发于 先知安全技术社区: https://xianzhi.aliyun.com/forum/user/5274 这次程序也是 DVRF 里面的,他的路径是 pwnable/She ...

  2. 一步一步pwn路由器之radare2使用全解

    前言 本文由 本人 首发于 先知安全技术社区: https://xianzhi.aliyun.com/forum/user/5274 radare2 最近越来越流行,已经进入 github 前 25了 ...

  3. 一步一步pwn路由器之wr940栈溢出漏洞分析与利用

    前言 本文由 本人 首发于 先知安全技术社区: https://xianzhi.aliyun.com/forum/user/5274 这个是最近爆出来的漏洞,漏洞编号:CVE-2017-13772 固 ...

  4. 一步一步pwn路由器之环境搭建

    前言 本文由 本人 首发于 先知安全技术社区: https://xianzhi.aliyun.com/forum/user/5274 正式进入路由器的世界了.感觉路由器这块就是固件提取,运行环境修复比 ...

  5. 一步一步pwn路由器之栈溢出实战

    前言 本文由 本人 首发于 先知安全技术社区: https://xianzhi.aliyun.com/forum/user/5274 本文以 DVRF 中的第一个漏洞程序 stack_bof_01 为 ...

  6. 一步一步pwn路由器之uClibc中malloc&&free分析

    前言 本文由 本人 首发于 先知安全技术社区: https://xianzhi.aliyun.com/forum/user/5274 栈溢出告一段落.本文介绍下 uClibc 中的 malloc 和 ...

  7. 一步一步pwn路由器之路由器环境修复&&rop技术分析

    前言 本文由 本人 首发于 先知安全技术社区: https://xianzhi.aliyun.com/forum/user/5274 拿到路由器的固件后,第一时间肯定是去运行目标程序,一般是web服务 ...

  8. 简单实例一步一步帮你搞清楚MVC3中的路由以及区域

    我们都知道MVC 3 程序的所有请求都是先经过路由解析然后分配到特定的Controller 以及 Action 中的,为什么这些知识讲完了Controller Action Model 后再讲呢?这个 ...

  9. 【计算机网络】一步一步学习IP路由流程

    TCP/IP协议簇是目前互联网应用最广的协议栈,谈到TCP/IP协议栈就不能不讲一讲IP路由的问题,因为在我们使用的网络通信中几乎每时每刻都在发生着IP路由的事件…….当你在网络世界中还是一位新手的时 ...

随机推荐

  1. POJ 1260

    //状态转移方程: F[i] = min{f[k] + (a[k+1]+………+a[i]+10} * p[i]} #include <iostream> #define MAXN 105 ...

  2. Windows server 2008 R2 安装AD域证书

    参考文档: http://blog.51cto.com/gaowenlong/1969585 http://blog.51cto.com/gaowenlong/1969586 安装后打开证书颁发机构 ...

  3. Maven使用常用命令

    > mvn clean 删除target文件夹 > mvn clean test 编译测试代码,默认被放到target/test-classes文件夹下面 > mvn clean c ...

  4. MySQL命令行导入sql文件时出现乱码解决方案

    Note: sql> source F:weibo.sql(执行相关sql文件) sql> select * from sina into outfile "/weibo.txt ...

  5. spring自定义注解拦截器的配置

    1.创建注解文件 (文件格式为注解) 这里面什么都不需要写 文件名就是注解名称 如下 是@anno package com.ABC123.anno; import java.lang.annotati ...

  6. Android 开发工具类 10_Toast 统一管理类

    Toast 统一管理类: 1.短时间显示Toast: 2.长时间显示 Toast: 3.自定义显示 Toast 时间. import android.content.Context; import a ...

  7. asp.net页面传值方法汇总

    1. Get(即使用QueryString显式传递)     方式:在url后面跟参数.     特点:简单.方便.     缺点:字符串长度最长为255个字符:数据泄漏在url中.     适用数据 ...

  8. golang协程池

    type GoroutinePoll struct { Queue chan func() error Total, Num int Result chan error FinishCallBack ...

  9. NoSQL之Redis入门笔记

    Redis 1.Redis介绍 1.1 NoSQL:一类新出现的数据库(not only sql),它的特点 不支持sql语法 存储结构跟传统关系型数据库中的那种关系表完全不同,nosql中存储的数据 ...

  10. alloca() 是什么?为什么不提倡使用它?

    在调用 alloca() 的函数返回的时候, 它分配的内存会自动释放.也就是说, 用 alloca 分配的内存在某种程度上局部于函数的 ``堆栈帧"  或上下文中. alloca() 不具可 ...