0x00 前言

本文中所介绍的方法目前只测试了单个的demo,并没有拿大型的项目做测试,但是应该是大同小异。这里介绍两种方法,一种是有独立的ARM硬件,另一种是依靠qemu实现的模拟化,其实其本质都是一样的。如果是大型项目的话最好还是建议有一个原生的环境,毕竟模拟环境通常会遇到一些意外的事。

0x01 依靠qemu搭建环境

环境准备

  • ubuntu 20.04

这里我的物理机是ubuntu,虚拟机一样的。首先需要安装一下qemu的环境和编译ARM汇编机器码的交叉gcc编译器,其安装命令如下

luna@ubuntu:~$ sudo apt update -y && sudo apt upgrade -y
luna@ubuntu:~$ sudo apt install qemu-user qemu-user-static gcc-aarch64-linux-gnu binutils-aarch64-linux-gnu binutils-aarch64-linux-gnu-dbg build-essential

然后我们编写一个测试代码,来验证编译和执行的效果

#include <stdio.h>

int main(void) {
printf("hello\n"); return 0;
}

然后在编译的时候添加一个-static选项,否则在程序执行时会出现动态链接库找不到的情况

luna@ubuntu:~/study/c$ aarch64-linux-gnu-gcc -static -o test test.c

然后执行查看结果

luna@ubuntu:~/study/c$ ./test
hello

到目前为止执行是没有什么问题了,接下来就是调试的问题,调试我们需要安装一下gdb的多架构支持版本,在ubuntu中只需要执行一下命令

sudo apt-get update && apt install gdb-multiarch -y

然后就是调试的设置了

0x02 调试

这里由于本地执行调试的话会出现问题,所以只能选择远程调试的方式,调试步骤如下,首先用qemu运行被调试程序,指定gdb远程调试端口为1234,文件名为test

luna@ubuntu:~/study/c$ qemu-aarch64 -L /usr/aarch64-linux-gnu/ -g 1234 ./test

然后在另外一个终端中,我们打开gdb-multiarch,然后键入如下的指令链接到远程目标

pwndbg> target remote 127.0.0.1:1234
pwndbg> file ./test
Reading symbols from ./test...

这样就可以通过源码调试的方式来调试程序了,结果如下图所示

0x03 动态链接的方式如何调试

刚才的调试环境基本接近完美,但是,问题是如过目标程序是动态链接的呢?这在实际的测试中是个大问题,解决的办法是在打开gdb以后指定一个路径,如下

For AArch64:
(gdb) set solib-search-path /usr/aarch64-linux-gnu/lib/

0x04 物理设备

在捣鼓了模拟环境以后,突然看到了之前淘汰的一个小米手机,刚好可以拿来作为ARM64的实际环境,首先需要安装一个termux,安装以后需要装一下ssh,基本步骤如下(注意,是在termux中操作)

#安装OpenSSH
$ pkg install openssh #运行SSH Server
$ sshd #设置密码
$ passwd #获得Android IP
$ ifconfig #PC端连接
$ ssh 用户名@ip -p 8022

注意手机必须和PC在一个网段内,然后在其上安装gccgdb

$ pkg install gcc gdb

然后就可以开心的调试了,

这里的一个问题是不能安装gdb的插件,如果不习惯的话可以用之前的远程调试来达到目的

#在手机端
gdbserver :1234 a.out #PC端
pwndbg> target remote 192.168.0.100:1234

linux搭建ARM可调式环境的更多相关文章

  1. Qemu搭建ARM vexpress开发环境(二)----通过u-boot启动Linux内核

    Qemu搭建ARM vexpress开发环境(二)----通过u-boot启动Linux内核 标签(空格分隔): Qemu ARM Linux 在上文<Qemu搭建ARM vexpress开发环 ...

  2. Qemu搭建ARM vexpress开发环境(三)----NFS网络根文件系统

    Qemu搭建ARM vexpress开发环境(三)----NFS网络根文件系统 标签(空格分隔): Qemu ARM Linux 经过上一篇<Qemu搭建ARM vexpress开发环境(二)- ...

  3. Qemu搭建ARM vexpress开发环境(一)

    Qemu搭建ARM vexpress开发环境(一) 标签(空格分隔): Qemu ARM Linux 嵌入式开发离不开硬件设备比如:开发板.外设等,但是如果只是想学习研究Linux内核,想学习Linu ...

  4. 2019.03.03 - Linux搭建go语言交叉环境

    编译GO 1.6版本以上的需要依赖GO 1.4版本的二进制,并且需要把GOROOT_BOOTSTRAP的路径设置为1.4版本GO的根目录,这样它的bin目录就可以直接使用到1.4版本的GO 搭建go语 ...

  5. win10下用Linux搭建python&nodejs开发环境

    Win10下用自带Linux系统搭建开发环境 Win10下用自带Linux系统搭建开发环境启用Linux老版本(win10 1709之前):新版本(win10 1709之后)卸载linux老版本新版本 ...

  6. Linux 搭建Nginx+uWSGI+Django环境

    安装环境 sudo apt-get install nginx sudo apt install python3 sudo apt install python3-pip 使用 sudo pip3 i ...

  7. 用Linux 搭建 PXE 网络引导环境

    本例子中使用了CentOS7.4 minimal 系统,并且关闭了防火墙和selinux,并使用了dhcp.tftp.http和samba服务. 假设PXE服务器是192.168.4.104 ,tft ...

  8. Linux搭建PHP+MySQL+Apache环境

    环境: CentOS 6.4 MySQL详细安装可参考:http://www.cnblogs.com/yangxia-test/archive/2012/11/12/2766237.html Apac ...

  9. 如何在linux搭建airtest+chromeweb测试环境--(用命令行运行.air脚本)

    大前堤: 如果你需要airtest提供的可视化测试报告,那你的操作系统,一定要有图形化界面. 否则运行你的airtest脚本 会遇到这样的问题 Xlib.error.DisplayNameError: ...

随机推荐

  1. 彻底理解Spring如何解决循环依赖

    Spring bean生命周期 可以简化为以下5步. 1.构建BeanDefinition 2.实例化 Instantiation 3.属性赋值 Populate 4.初始化 Initializati ...

  2. robotframework中的参数展开

    robot调用关键字传参的方式是用分隔符分开不同参数,如 keyword arg1 arg2 arg3 arg4 当参数中传入了使用@符号的列表变量时,@符号会将列表展开: @{list1}= Cre ...

  3. 私有Maven仓库安装和使用

    安装 这里选择安装的是windows平台,linux安装类似,下载可能要梯子 官网下载页 https://help.sonatype.com/repomanager2/download 下载链接 ht ...

  4. Long类型数据传递到前端数据精度丢失问题

    在开发页面的时候,遇到Long类型的数据,传送给前端遇到精度丢失的问题, 后端发的数据是这个. 前端接收到的数据是这样 解决的途径有二种:1 .在后端把Long类型的数据改成String类型(不推荐) ...

  5. JAVA多线程下高并发的处理经验

    java中的线程:java中,每个线程都有一个调用栈存放在线程栈之中,一个java应用总是从main()函数开始运行,被称为主线程.一旦创建一个新的线程,就会产生一个线程栈.线程总体分为:用户线程和守 ...

  6. Linux嵌入式学习-mount命令+nfs挂载失败原因【转】

    NFS 挂载失败原因[待搜集] 1.挂载时若出现mount.nfs: Input/output error 解决:在客户端也需启动portmap服务 service portmap status[查看 ...

  7. Liunx运维(七)-用户管理及用户信息查询命令

    文档目录: 一.useradd:创建用户 二.usermod:修改用户信息 三.userdel:删除用户 四.groupadd:创建新的用户组 五.groupdel:删除用户组 六.passwd:修改 ...

  8. JDBC访问数据库的基本步骤是什么?

    1.加载(注册)数据库驱动(到JVM) 2.建立(获取)数据库连接. 3.创建(获取)数据库操作对象. 4.定义操作的SQL语句. 5.执行数据库操作. 6.获取并操作结果集. 7.关闭对象,回收数据 ...

  9. 深入理解Kafka必知必会(1)

    Kafka的用途有哪些?使用场景如何? 消息系统: Kafka 和传统的消息系统(也称作消息中间件)都具备系统解耦.冗余存储.流量削峰.缓冲.异步通信.扩展性.可恢复性等功能.与此同时,Kafka 还 ...

  10. Sqoop(一)安装及基本使用

    Sqoop:     1.sqoop从数据库中导入数据到HDFS     2.SQOOP从数据库导入数据到hive     3.sqoop从hive中将数据导出到数据库   sqoop底层还是执行的m ...