使用IDA查看二进制

文章目录

      • 1 IDA是什么?
      • 2 IDA界面
      • 3 汇编基础
      • 4 IDA查看hello world二进制
      • 5 查看带有条件语句和函数调用的二进制
      • 6 总结

1 IDA是什么?

IDA是一款反编译软件,可以查看二进制的汇编代码,常用于逆向和问题定位。与其他商业软件类似,IDA也提供了很多类型的版本,基础的用法可以使用IDA Free。本文会简单介绍下IDA的基本用法。

2 IDA界面

请添加图片描述

  • 最上面是功能菜单和快捷按钮
  • 在快捷按钮下方有彩色的条带色块,不同的颜色表示不同的段,例如,浅黄色是数据段,黄色是代码段,当选中某行代码时,就会在该位置显示小的绿色箭头
  • 主界面的左侧是函数列表,右侧显示汇编代码
  • 最下面就是输出窗口,例如对文件进行分析是否成功

3 汇编基础

按照汇编指令的风格,主要分成两种:

  • Intel汇编:x86架构汇编语言中使用的风格,被Windows平台采用
  • AT&T汇编:x64架构汇编语言中使用的风格,被Linux平台采用

两种汇编语言一个比较大区别就是操作数的顺序,Intel汇编的源操作数在右边,目的操作数在左边,而AT&T则刚好相反。

每条汇编指令包含两个部分:操作码和操作数,有的指令只有一个操作数,有的指令有多个操作数。

常用的操作码(不同的汇编的操作码的名称有小的差别):

  • move:将数据从一个位置移动到另一个位置,两个位置就是两个操作数
  • load/store:将数据加载到寄存器/将数据从寄存器保存到内存
  • cmp:比较两个操作数,并设置比较结果
  • test:
  • jmp/je/jz/jne/jnz/jg:跳转,可以直接跳转,也可以根据前一条的比较结果进行跳转
  • call:函数调用
  • ret:函数返回
  • push/pop:将数据压栈/出栈

操作数的类型:

  • 立即数:常量值
  • 寄存器:如rax
  • 内存地址:使用基址、变址、相对寻址的方式指定内存地址
  • 标签:用于跳转类指令
  • 字符串常量:用于表示代码中的字符串常量

4 IDA查看hello world二进制

请添加图片描述

上述截图是代码段的起始部分,_start函数是一个特殊的函数,表示代码程序的入口点,在_start函数的最后调用了main函数:call cs:__libc_start_main_ptr,call指令用于调用函数,cs是代码段的基址寄存器,其中保存着代码段的基地址,__libc_start_main_ptr是一个特殊的符号,由libc定义,指向一个函数指针,该函数会执行一系列的初始化工作,然后再调用我们的main函数。

请添加图片描述

main procmain endp用于定义main函数。

rbp和rsp结合起来实现对函数的调用,其中,rbp是Base Pointer寄存器,函数调用过程中保存的是帧的基地址。rsp是Stack Pointer寄存器,堆栈指针寄存器,始终指向当前线程的堆栈顶部。在函数内部的指令执行时,rbp不变,如果使用了函数级别的变量,则rsp会更新。

任何函数调用的开头两行指令通常是:

  • push rbp:将当前的rbp保存到栈中,当前的rbp保存的是上一个函数的基地址
  • mov rbp, rsp:将栈地址保存到帧寄存器

此时,rbp=rsp,而rbp+1(栈是向低地址增长的)的位置处保存的是上一个函数的基地址。

任何函数调用的结尾两行指令通常是:

  • pop rbp:将栈顶的值保存到rbp,此处栈顶的值就是上一个函数的基地址
  • retn:函数返回,与call指令相对应

去掉main函数中与函数调用相关的指令,剩下的4条指令为:

  • lea rax, s:s是hello world字符串的地址,lea质量将字符串的地址放到rax寄存器中
  • mov rdi, rax:将刚才得到的字符串的地址放到rdi中,该寄存器是函数调用的第一个参数
  • call _puts:调用_puts函数输出字符串
  • mov eax, 0:将eax寄存器设置为0,该寄存器作为函数的返回值,此处就是main函数的返回值

如果直接在linux中使用objdump查看二进制,看到的汇编代码如下:

请添加图片描述

前面也说过,Linux采用的是AT&T格式的汇编,源操作数在右边,而windows上的则相反,另一个区别就是寄存器名称,AT&T的前面带有%,而Intel汇编则没有,除了这些,使用objdump得到的汇编代码和IDA一样。

5 查看带有条件语句和函数调用的二进制

在查看某个函数的调用关系时,按下空格键可以切换到图形显示方式。

请添加图片描述

main函数跟hello world的差别不大,唯一就是在调用func1时,通过esi和edi传递了两个参数。

请添加图片描述

func1函数的开始部分就是获取两个参数,通过一系列mov操作,两个参数放到了帧的顶部和edx/eax中,然后调用_printf函数,使用cmp指令比较第一个参数和0,实用jnz判断比较的结果,左边的红色的分支表示jnz判断失败,右边绿色的分支表示jnz判断成功,因此,当第一个参数不为0时,就执行右边,当参数为0时,就执行左边,分支执行完成后,两个分支都会沿着蓝色的流程继续执行,调用func2,然后将func2的结果保存到第一个变量,然后函数结束。

IDA将整个执行流程以框图的形式展示,当其中有分支时,通过绿色红色的分支线表示判断成功和失败的执行流,蓝色的线表示顺序的执行流。在了解这种用法后,遇到复杂的调用,可以直接跳过某些流程,直接定位到要查看的代码的附近。

6 总结

IDA是一款可以查看二进制的汇编级别代码的工具,并且提供了图形的方式展示程序的执行流程,有时候可以用来定位汇编级别的代码崩溃问题。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/769553.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

C++11特性--统一的列表初始化

个人主页:Lei宝啊 愿所有美好如期而遇 {} 初始化及std:initializer_list 一 这种初始化方式我们建议用第一种,但是以后看见下面两种也不要感到疑惑,是可以这样初始化的。 int main() {int a 1;int b { 1 };int c{ 1 };return 0; } 二…

数据链路层(三):流量控制和链路管理

目录 1 流量控制和链路管理1.1 流量控制介绍1、什么是流量控制2、流量控制的功能和方法 1.2 停止等待1.3 滑动窗口1、滑动窗口2、发送方滑动窗口3、接收方滑动窗口4、滑动窗口的流量控制使用滑动窗口如何实现流量控制的为什么滑动窗口的大小比模数小1滑动窗口控制流量采取的措施…

【SpringBoot3+Mybatis】框架快速搭建

文章目录 GitHub 项目一、依赖二、 配置文件三、启动类四、SpringBoot3兼容Druid报错五、工具类5.1 结果封装类5.2 解决枚举类5.3 MD5加密工具类 GitHub 项目 springboot-part——springboot-integrate-07 Mybatis-plus版完整CRUD项目文档记录: 【SpringBoot3Myba…

“神器”巩膜镜,为屈光不正及难治角膜病患者带来希望!

“我不想再戴回框架眼镜了,但是由于角膜疾病问题,我曾戴普通隐形眼镜和RGP都会出现极强的异物感,非常不舒服!现在我该怎么办呢?”四川眼科医院门诊,张女士疑惑地问到。 28岁的张女士是一名圆锥角膜患者&am…

Pixelmator Pro:专业级图像编辑,触手可及mac版

Pixelmator Pro是一款功能强大的图像编辑软件,专为Mac操作系统设计。它拥有直观的界面和丰富的工具,能够满足用户各种图像处理需求。 Pixelmator Pro软件获取 首先,Pixelmator Pro支持多种文件格式,包括JPEG、PNG、GIF、BMP、TIF…

【包远程安装运行】SpringBoot+Mysql实现的美食分享菜谱制作平台+演示视频+开发文档(论文模板)

今天发布的是由【猿来入此】的优秀学员独立做的一个基于springboot脚手架的美食分享菜谱制作平台系统,该系统分为前台和后台,多用户分享平台。主要实现了 除脚手架功能以外下面是系统的功能: 前台普通用户:注册、登录、首页、美食…

政安晨:【深度学习实践】【使用 TensorFlow 和 Keras 为结构化数据构建和训练神经网络】(三)—— 随机梯度下降

政安晨的个人主页:政安晨 欢迎 👍点赞✍评论⭐收藏 收录专栏: TensorFlow与Keras实战演绎 希望政安晨的博客能够对您有所裨益,如有不足之处,欢迎在评论区提出指正! 这篇文章中,咱们将使用Keras和TensorFlow…

GPT神器级插件Code Interpreter

自去年 3 月份以来,人们对 GPT-4 API 的兴趣激增,“有数百万开发人员请求访问”。OpenAI 在一篇博客文章中,分享了使用 GPT-4 正在进行的一系列令人兴奋的创新,并阐明了未来的愿景:未来基于聊天的大模型可以用在任意的…

每秒批量插入10000条数据到MySQL中,资源消耗(带宽、IOPS)有多少?

文章目录 🔊博主介绍🥤本文内容起因代码资源情况改造 📢文章总结📥博主目标 🔊博主介绍 🌟我是廖志伟,一名Java开发工程师、Java领域优质创作者、CSDN博客专家、51CTO专家博主、阿里云专家博主、…

LeetCode每日一题[c++]-322.零钱兑换

题目描述 给你一个整数数组 coins ,表示不同面额的硬币;以及一个整数 amount ,表示总金额。 计算并返回可以凑成总金额所需的 最少的硬币个数 。如果没有任何一种硬币组合能组成总金额,返回 -1 。 你可以认为每种硬币的数量是无…

照片变动图怎么操作?一招在线转换

GIF动画是一种特殊的图像文件格式,它可以在一张图像中显示多个图像帧,并以循环播放的方式展示,从而实现动态效果。由于GIF格式的广泛支持和较小的文件大小,它成为了互联网上常见的动画格式之一。想要制作gif动画图片可以使用Gif制…

链动2+1模式 完全合法合规 不存在传销问题!!

在商业经营中,营销策略的巧妙运用对于提升产品销量和扩大品牌影响力至关重要。然而,企业在制定和执行营销策略时,必须严格遵循法律法规,以免陷入法律风险。本文将着重探讨链动21模式的法律要素,以论证其合规性。 一、链…

穿越地心:3D可视化技术带你领略地球内部奇观

在广袤无垠的宇宙中,地球是一颗充满生机与奥秘的蓝色星球。我们每天都生活在这颗星球上,感受着它的温暖与恩赐,却往往忽略了它深邃的内部世界。 想象一下,你能够穿越时空,深入地球的核心,亲眼目睹那些亿万年…

nodeJs中实现连表查询

nodeJs中实现连表查询 router.post(/getOrder, async function(req, res, next) {let userId req.body.phone;let sql select * from orders where userId?;let orders await new Promise((resolve, reject) > {connection.query(sql, [userId], function(error, resul…

MapReduce配置和Yarn的集群部署

一、集群环境,还是如下三台服务器 192.168.32.101 node1192.168.32.102 node2192.168.32.103 node3 二、YARN架构 YARN,主从架构,有2个角色 主(Master)角色:ResourceManager从(Slave&#x…

【Redis教程0x04】详解Redis的4个高级数据类型

引言 在【Redis教程0x03】中,我们介绍了Redis中常用的5种基础数据类型,我们再来回顾一下它们的使用场景: String:存储对象、url、计数、分布式锁;List:消息队列;Hash:存储对象、购…

ChatGPT论文指南|ChatGPT论文写作过程中6个润色与查重口诀!【建议收藏】

点击下方▼▼▼▼链接直达AIPaperPass ! AIPaperPass - AI论文写作指导平台 公众号原文▼▼▼▼: ChatGPT论文指南|ChatGPT论文写作过程中6个润色与查重口诀!【建议收藏】 目录 1.润色与查重口诀 2.AIPaperPass智能论文写作平台 论文完成…

商机在线互动营销— —Pushmall智能AI数字名片

商机在线互动营销— —Pushmall智能AI数字名片 开发计划 2024年2月开发计划: 1、优化名片注册、信息完善业务流程; 2、重构供应信息、需求信息发布。 3、会员名片地理位置服务优化‘ 4、企业名片:员工管理优化 5、CRM客户资源管理设计。 已…

基础小白十天学会linux------linux的指令

1.图形界面使用shell命令 2.字符界面使用shell命令 3.shell命令一般格式:命令名选项参数,命令名一般是英文全称的缩写,选项前导符以-、--开头,还可以没有前导符 字符界面截屏要求: 1) 启动计算机,以超级用…

新手摄影笔记-基础知识-按键和参数说明【1】

1. 相机正反面 2.顶部 3.屏幕 4.光圈、快门、感光度 什么是景深呢?景深就是照片中清晰和模糊的范围,也就是前后的距离。景深越深,意味着照片中清晰的范围越大,前后的距离越长,背景越清晰。景深越浅,意味着照…