动态调试elf文件的几种方法腾讯云开发者社区

最近在刷题的时候遇到了很多elf文件,虽然可以通过ida分析伪代码解出来,但是发现有些通过动态调试的方式可以直接找到flag,这样简单了不少,因为之前接触的linux下的逆向题目比较少,所以通过这次刷题也记录一下动态调试elf文件的几种方式。

ida不光可以静态分析函数伪代码,也可以通过动态调试的方式来分析linux下的elf文件。

首先将ida/dbgsrv/路径下的linux_server/linux_serverx64文件复制到linux下,两个文件分别是调试32位和64位程序使用的:

在linux下启动对应的文件:

把我们要调试的文件放到相应的文件夹中,这里我放到/homt/test/文件夹中。

在ida中选择Debugger-Run-Remote linux debugger

在弹出的对话框中,Application填写文件存放的位置和文件名,Directory中填写文件存放的路径,Parameters是指传递的参数,如果程序运行需要传参的话可以在这填入,Hostname就是linux的ip地址,Port一般都是默认的23946,如果设置了password在下方填入,没有就空着:

进入ida动态调试界面,默认情况下界面大概分为6个区域(通用寄存器和标志寄存器窗口为1个),模块列表和线程列表我不怎么看,主要是看反汇编和寄存器还有堆栈。

ida在动态调试的时候和OD差不多,F9继续运行,F7步入,F8步过,F2下断点。

通过Debugger-Breakpoints-Breakpoint list或者Ctrl+Alt+B来查看已经下的断点:

也可以通过Debugger-Debugger windows-Stack trace或者Ctrl+Alt+S查看是谁调用了当前的函数:

虽然感觉没有OD好用,但是实现简单的调试还是没有问题的。

GDB是GNU开源组织发布的一个强大的UNIX下的程序调试工具。

一般在kali中,gdb都是默认安装的。

使用gdb调试可执行文件

运行程序

断点

查看

我在使用的过程中大概用到的就是这些命令。

radare2是一个开源项目,他可以使用命令直接执行,也有GUI程序叫做Cutter并且兼容多平台。

在kali中r2也是默认安装的,可以直接在控制台运行,进入程序后使用aaa命令分析程序

也可以直接使用r2 -A ./program来直接分析程序

在分析程序之前,r2的iI命令可以提供很多有用的信息

在了解程序的基本信息后你还可以通过ii和iE命令来看下程序的导入和导出函数,从而能够更好的了解程序实现的功能

你还可以通过afl命令查看程序存在的函数,从而找到main函数,定位到对应的位置,查看反汇编代码

在找到程序内存在的函数后,可以使用axt命令来查看函数调用

在找到main函数后,使用s命令定位到main函数,pdf命令来查看函数的反汇编代码,s命令后可以加地址或者函数名

如果觉得看反汇编不过瘾也可以通过px命令查看十六进制内容

同时,为了能够更好的理解程序的功能,iz命令可以查看程序中的字符串

字符串和函数一样,可以使用axt命令查看是哪里把它打印出来的

r2还提供了可视模式,可以更直观的分析函数的调用,vv命令进入

以上是使用r2静态分析二进制文件,然后r2的功能不止于此,它还可以动态调试二进制文件甚至给我函数的伪代码

使用r2 -d -A ./program命令来进入调试器

动态调试的主要命令

同时,r2可以通过插件实现反编译功能,使用r2pm -l命令查看当前插件,r2的插件有很多,这里使用r2dec反编译插件来实现对程序的反编译,r2pm -install r2dec来安装,安装完成后可以直接在r2中使用-A加载程序,然后使用r2dec反汇编程序,反汇编的命令是pdda

这样可以清晰的对比观察汇编代码和反编译后的伪代码,更方便观察。

radare2还有很多插件可以使用,大家有兴趣的话可以在深入研究一下。

getit这是攻防世界的一道re题,这道题拿到手是个elf文件,我首先是放到ida里看了看伪代码

本来这道题目应该是写逆向算法得到flag,但是经过分析和与反汇编代码对比,发现flag应该是被存在了eax里面

在调试程序的时候,我们可以ida配合gdb来说使用,虽然ida本身也有动态调试的功能,但是我推荐用ida来分析反汇编和伪代码,然后通过gdb或者r2来进行动态调试查看寄存器的值,或者使用r2反编译和反汇编代码对比分析,这样就可以方便不少,这里猜测flag应该存在eax中,可以通过gdb动态调试程序,在0x400832处下断点,让程序运行

运行程序到断点处,查看寄存器存储的地址的值,就能得到flag

这样通过动态调试的方式,省了很多事。

本文简单介绍了ida、gdb和r2动态调试二进制文件的方法,也是自己最近在做ctf题目的时候使用的,之前只会用od和ida,使用gdb和r2很少,正好借此机会也学习了一下,对于我这种菜鸡来说,在分析二进制文件的时候,3种工具一起使用效果会好一些。

THE END
0.构造方法详解本文详细介绍了构造方法的概念、语法特点及其作用,包括创建对象和初始化实例变量,并通过具体代码示例展示了构造方法的重载和使用。 1、构造方法又被称为构造函数/构造器/Constructor 2、构造方法的语法结构: [修饰符列表] 构造方法名(形式参数列表){ 构造方法体; jvzquC41dnuh0lxfp0tfv8|gkzooa=:9396848ftvkimg8igvcomu86377=97:9
1.Java构造方法详解1、构造方法又被称为构造函数/构造器/Constructor 2、构造方法语法结构: [修饰符列表] 构造方法名 (形式参数列表) { 构造方法体; } 3、回顾一下普通方法的语法结构: [修饰符列表] 返回值类型 方法名 (形式参数列表) { 方法体; } 4、对于构造方法来说,“返回值类型”不需要指定,并且也不能写void。只要写jvzquC41dnuh0lxfp0tfv8|gkzooa?7:5:7978ftvkimg8igvcomu86447?27@9
2.JS中常见的8种继承方法总结javascript技巧子类使用super关键字调用父类的构造函数,并可以访问父类的属性和方法。ES6类继承提供了更加语法简洁和面向对象的继承方式。 以上是JavaScript中常见的八种继承方式,每种方式都有其特点和适用场景。根据具体需求,你可以选择适合的继承方式来构建对象之间的关系。 总结 到此这篇关于JS中常见的8种继承方法的文章就介绍到jvzquC41yy}/lk:30pku1sfxcuiskyy1527:3@=gj0nuo
3.Java构造方法2、构造方法的重载 一、概述 构造方法也叫作构造器、构造函数。但是我们平时习惯上还是会叫做构造方法。 作用:在创建对象的时候给成员变量进行初始化。 这里的初始化是一个专业名字,其实就是赋值的意思。 因此构造方法简单理解:就是在创建对象的时候给成员变量进行赋值的。 jvzquC41dnuh0lxfp0tfv8vsa5?:4:6571gsvrhng1jfvjnnu174;A>53;=
4.构造函数方法构造函数方法 1. 默认构造函数 没有参数的构造函数。 classExample{ public: Example() {} }; AI写代码 2. 带参数的构造函数 classExample{ public: intvalue; Example(intv) :value(v) {} }; AI写代码 3. 拷贝构造函数 用于通过另一个同类型的对象来创建新对象。jvzquC41dnuh0lxfp0tfv8tpgvkmcoz1ctzjeuj1fgzbkux136612;=34
5.学好数学的方法与技巧六种解题思想 1.函数与方程思想 函数与方程的思想是中学数学最基本的思想。所谓函数的思想是指用运动变化的观点去分析和研究数学中的数量关系,建立函数关系或构造函数,再运用函数的图像与性质去分析、解决相关的问题。而所谓方程的思想是分析数学中的等量关系,去构建方程或方程组,通过求解或利用方程的性质去分析解决问jvzquC41yy}/z~jzkng/exr1yc0|qnfcq5d4@<260nuou
6.软件技术专业人才培养方案(三年制)④具备良好的语言文字应用能力,了解中华优秀文化,掌握常用应用文的写作方法。 ⑤掌握一定的英语基础知识,在听、说、读、写、译中能正确运用所学语法知识。 ⑥掌握体育与健康必备的理论与实践的知识与技能;领会体育精神与体育文化;具备运动安全和健康养护知识。 jvzquC41yy}/hyk0et0cugd1463585;345d4B92c3:87:<1rcmf0qyo
7.JavaScript8种继承方式(全)kiss雪夜JavaScript - 8种继承方式 (全) 什么是继承 =>就是让一个对象使用了不属于自己的属性和方法 继承的作用 =>将相关的构造函数之间的公共方法提取出来,放在一个公共的构造函数上,节省空间 八种继承的方法: (本文栗子全部使用 Student 构造函数继承 Person 类)jvzquC41yy}/ewgnqiy/exr1{wsn{uzem{5q1:578781:7mvon