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. PHP 直接使用html输出excel

    1 <?php 2 header("Cache-Control:public"); 3 header("Pragma:public"); 4 5 head ...

  2. Docker实例开机启动

    部署项目服务器时,为了应对停电等情况影响正常web项目的访问,会把Docker容器设置为开机自动启动. 在使用docker run启动容器时,使用--restart参数来设置: docker run ...

  3. C#动态实体集的反序列化(动态JSON反序列化)

    一.使用场景 我们在将 JSON 反序列化实体集的时候,如果字段是固定的,那么我们序列化非常简单,对应字段写的实体集就可以了.比如下面这种: { "data":[ { " ...

  4. 配置redis服务器允许远程连接

    说明 默认情况下,redis只允许本机访问.如果需要外部访问,需要修改下配置文件. 配置修改 redis.windows.conf 将bind 127.0.0.1 注释 将protected-mode ...

  5. 自己总结的关于图论的一些算法实现(C语言实现,有较详细注释,800行左右)

    1 #include<stdio.h> 2 #include<stdlib.h> 3 #include<string.h> 4 #define TRUE 1 5 # ...

  6. Fast Bokeh Effects Using Low-Rank Linear Filters

    Fast Bokeh Effects Using Low-Rank Linear Filters paper地址:https://www.researchgate.net/publication/27 ...

  7. Python 字符串操作分类

    应用举例: str="abc defghi jklm nopqrstuvwxyz" print(str.isspace()) 运行结果: False 1) 判断类型 方法 | 说明 ...

  8. 一次失败的java Box居中尝试

    效果如下: 通过Box的应该虽然实现了居中,但是页面相当丑!且不能插入JTextField等文本框,总的来说相当失败!!! import javax.swing.Box; import javax.s ...

  9. Java学习日报7.17

    控制台运行

  10. 单细胞分析实录(1): 认识Cell Hashing

    这是一个新系列 差不多是一年以前,我定导后没多久,接手了读研后的第一个课题.合作方是医院,和我对接的是一名博一的医学生,最开始两边的老师很排斥常规的单细胞文章思路,即各大类细胞分群.注释.描述,所以起 ...