Linux中如何用ida调试fork后的子进程

原文链接

=> https://redqx.github.io/linux/2024/07/24/linux-debugfork.html

本文的一些图片引用可能有一些问题, 比如数据不对劲,但无伤大雅

自己懒得粘贴图片了

环境:

wsl-kali-2024

ida-7.7 插件: Lazy_ida, 还有一个什么插件不知道什么名字, 可以把汇编转字节码

测试文件: elf_amd64

    Arch:     amd64-64-littleRELRO:    Partial RELROStack:    No canary foundNX:       NX enabledPIE:      PIE enabled

发现

目标 首先我想要干嘛?

我想达到这么一个效果, fork()函数执行之后,子进程不立刻执行原有的流程,

而是等待我另外一个IDA附加之后,让IDA决定是否立马执行

示例代码

#include <stdio.h>
#include <unistd.h>void demo_func(int x,int y,int z)
{if(fork()){//父亲while(1){printf("[F]=>%d\n",x);x++;if(x==100){break;}sleep(1);}}else{//儿子while(1){printf("[S]=>%d\n",y);y++;if(y==50){break;}sleep(1);}}
}int main()
{demo_func(1,2,3);return 0;
}

首先我们得明白fork()干了什么?

其实我也不太知道它干了什么, 但有一点我们是都知道的: fork()把父进程的内存拷贝进了子进程

知道这一点就可以实现我的思路一了, 首先我们得对这句话多加理解和思考.

我其实思考得并不多,只是碰巧想到了一些点子. (想了很久,QAQ…)

1), 发现一:

我发现子进程和父进程的加载的基地址是一样的,这点让我有点惊讶

同时也作证了 fork后的子进程拷贝了父进程的内存,这可能是我们的突破点

2), 发现二

我在fork()函数之前或者之后下的断点,也出现在了子进程

这就导致子进程运行的时候,会碰到int3异常,然后异常抛给了父进程, 这里可能是我们的突破点

image-20240724235546295

3), 发现三

执行完fork后,可以看到一些寄存器发生了变化

rax是fork的返回值,当然发生变化

然后是rcx,rdx,rdi,rsi都变为了0

r10和r11也发生了变化

然后当前函数栈并没有发生变化

image-20240724232432414

(思路一): jmp self

写一个死循环, 让子进程无法执行后续的逻辑

image-20240725000553220

在执行fork之前,我们就在父进程 0x000055619C6C01A2处写入死循环

比如 效果是jmp 0x000055619C6C01A2

在写入之前,我们得对以前的字节码备份,因为后面需要还原的

这句汇编代码的字节码只需要2字节: EB FE

修改8B 45 => EB FE

image-20240725000949398

然后我们就直接在父进程F8

image-20240725001040591

然后启动另外一个IDA附加我们的子进程

此刻的子进程还是死循环中

开启另外一个IDA

┌──(kali㉿G16-7620)-[~/code/file/dbg/ida/7.7]
└─$ ./linux_server64 -p 6789
IDA Linux 64-bit remote debug server(ST) v7.7.27. Hex-Rays (c) 2004-2022

然后IDA附加子进程

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

注意端口

image-20240725001221351

父进程的PID是11127,

image-20240725001251217

选择子进程,

image-20240725001409889

进入子进程后,直接F9

image-20240725001443654

在父进程中,死循环位于0x000055619C6C01A2

image-20240725001513781

在子进程中,相同的位置,我们去往,并下一个断点

ps: 子进程和父进程的内存分布是一样的

image-20240725001607641

下了断点后,死循环就立刻停下来了

此刻我们还原以前的字节码,重新设置rip, 就可以正常调试子进程了 EB FE => 8B 45

(思路二): sleep(60)

思路一有个缺点: 子进程进入死循环, 我的电脑的风扇就开始转了,貌似死循环很吃内存

同时思路一有个优点: 那就是我们可以慢慢的操作,直到成功附加子进程

思路一的优点是相对思路二的

针对思路一,死循环吃CPU, 那就调用sleep, 睡60秒

为什么睡60s, 经过测试总结的, 读者可自行调节

sleep函数在libc.so中本来就存在, 所以我们可以直接去调用.

而不是因为本代码本来就有sleep函数的导入

image-20240724224042289

在libc.so中找到sleep

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

找到位置是 0x7F2EC86B7050

image-20240724224058363

这一次我们写入的6个字节码,同时还需要修改一下栈[rsp]的数据,

同样我们要记录备份一下字节码, 同时还有[rsp]的值

写入 8B 45 F8 89 C6 48 => 6A 3C 5F FF 14 24

效果是

push    60
pop     rdi
call    qword ptr [rsp]

同时把[rsp]的值修改为sleep函数的地址

0x0000003000000000 => sleep函数地址

栈视图

image-20240725003227657

汇编视图

image-20240725003518796

然后, 我们在父进程F8执行了fork()

然后就是和思路一操作一样了

注意是 call qword ptr [rsp]后一句下断点

之后是完全可以成功断点来的, 得在子进程运行60s之后

所以我们的操作得在60s之内完成,我测试了一下自己差不多可以在40秒完成

image-20240724235259801

(思路三): int3异常

既然会出现内存拷贝

那么我在子进程第一句代码处下一个断点

image-20240725004938138

在父进程运行了F8了fork()之后

父进程继续F8

子进程抛来一个异常(因为子进程遇到了int3异常)

子进程遇到异常,抛给了父进程

image-20240725004956865

此刻子进程处于暂停状态

但是我现在还无法做到让IDA附加子进程, 会提示报错,不让附加

image-20240725005849936

父进程后续运行会, IDA一直会提醒父进程处理异常

image-20240725005948798

子进程无法处理int3异常,没有异常处理函数

父进程又不能直接忽略异常, 因为跳过int3, 子进程后续执行会出现问题

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

如若内容造成侵权/违法违规/事实不符,请联系瞎胡闹网进行投诉反馈,一经查实,立即删除!

相关文章

基于PaddleClas的人物年龄分类项目

目录 一、任务概述 二、算法研发 2.1 下载数据集 2.2 数据集预处理 2.3 安装PaddleClas套件 2.4 算法训练 2.5 静态图导出 2.6 静态图推理 三、小结 一、任务概述 最近遇到个需求&#xff0c;需要将图像中的人物区分为成人和小孩&#xff0c;这是一个典型的二分类问题…

DLMS/COSEM中公开密钥算法的使用_椭圆曲线加密法

1.概述 椭圆曲线密码涉及有限域上的椭圆曲线上的算术运算。椭圆曲线可以定义在任何数字域上(实数、整数、复数)&#xff0c;但在密码学中&#xff0c;椭圆曲线最常用于有限素数域。 素数域上的椭圆曲线由一组实数(x, y)组成&#xff0c;满足以下等式: 方程的所有解的集合构成…

7月23日JavaSE学习笔记

异常&#xff1a; 程序中一些程序处理不了的特殊情况 异常类 Exception 继承自 Throwable 类&#xff08;可抛出的&#xff09; Throwable继承树 Error&#xff1a;错误/事故&#xff0c;Java程序无法处理&#xff0c;如 OOM内存溢出错误、内存泄漏...会导出程序崩溃 常见的…

结构拼图的艺术——组合模式(Python实现)

大家好&#xff0c;今天我们继续来讲结构型设计模式&#xff0c;上一期我们介绍了桥接模式&#xff0c;帮助大家理解了如何通过分离抽象部分和实现部分来实现代码的解耦。 今天&#xff0c;我们将介绍另一个非常实用的设计模式——组合模式&#xff0c;这个模式特别适合用于处…

Vue实现简单小案例

一、创建文件夹 二、引用vue.js <script src"../js/vue.js"></script> 三、准备一个容器 <div id"app"><h1>Hello,{{name}}</h1> </div> 四、创建实例 <script>new Vue({el:"#app", //el用于指…

Godot入门 03世界构建1.0版

在game场景&#xff0c;删除StaticBody2D节点&#xff0c;添加TileMap节点 添加TileSet图块集 添加TileSet源 拖动图片到图块&#xff0c;自动创建图块 使用橡皮擦擦除。取消橡皮擦后按住Shift创建大型图块。 进入选择模式&#xff0c;TileMap选择绘制&#xff0c;选中图块后在…

60V_20A超大电流LED照明车灯舞台灯同步降压芯片,驱动效率达99%并具有PWM极佳调光功能

简介 PC1226 是一款同步降压驱动控制芯片&#xff0c;用于驱动大功率 LED。芯片工作电压范围 7~60V&#xff0c;能够稳定输出高达数十安培的驱动电流&#xff0c;且有着极高的转换效率。 PC1226 集成了 PMOS 驱动模块&#xff0c;用于驱动高侧的 PMOS 功率 MOS&#xff0c;与…

【NPU 系列专栏 2 -- NVIDIA 的 H100 和 H200 是什么?】

请阅读【嵌入式及芯片开发学必备专栏】 文章目录 NVIDIA H100 和 H200 芯片NVIDIA H100 芯片简介NVIDIA H100 主要特点NVIDIA H100 应用场景NVIDIA H100 使用举例NVIDIA H200 芯片简介NVIDIA H200 主要特点NVIDIA H200 应用场景NVIDIA H200 使用举例Summary NVIDIA H100 和 H20…

甲方怒斥!!!为什么媒体不按原稿发布?

传媒如春雨&#xff0c;润物细无声&#xff0c;大家好&#xff0c;我是51媒体网胡老师。 前几天执行了一个媒体邀约的项目&#xff0c;邀约媒体参会&#xff0c;以及活动现场一切都很顺利&#xff0c;稿件同步的很晚&#xff0c;但还是让几个媒体连夜进行了刊登报道&#xff0…

AutoMySQLBackup execution.. Backup failed Docker部署mysql 自动备份失败!!

摘要&#xff1a; Docker容器部署的mysql5.7版本遇到使用AutoMYSQLBackup备份失败了&#xff0c;反复修改automysqlbackup.conf也不起效。这里推荐一种新的办法绕开老路子直接备份。 目录 一、环境介绍 二、AutoMYSQLBackup 三、问题描述 四、解决思路 4.1第一种解决思…

用cmake创建一个c++工程,调用c语言函数打印“c hello!”。

要使用CMake创建一个C工程&#xff0c;并在其中调用C语言函数以打印“C hello!”&#xff0c;你可以按照以下步骤操作&#xff1a; 1. 项目目录结构 首先&#xff0c;确保你的项目目录结构如下&#xff1a; CPlusPlusWithCLibrary ├── CMakeLists.txt └── src├── m…

C++的map和set介绍

系列文章目录 二叉树搜索树 map和set习题 文章目录 系列文章目录前言一、关联式容器键值对二、树形结构的关联式容器2.1 set2.1.1 set的介绍2.1.3 set的使用删除节点find的不同效率count举例lower_bound 和 upper_bound 2.2 multiset2.2.1 区别&#xff1a;find查找erase删除e…

【深度学习】大模型GLM-4-9B Chat ,微调与部署(3) TensorRT-LLM、TensorRT量化加速、Triton部署

文章目录 获取TensorRT-LLM代码&#xff1a;构建docker镜像并安装TensorRT-LLM&#xff1a;运行docker镜像&#xff1a;安装依赖魔改下部分package代码&#xff1a;量化&#xff1a;构建图&#xff1a;全局参数插件配置常用配置参数 测试推理是否可以代码推理CLI推理 性能测试小…

FFmpeg音视频流媒体的顶级项目

搞音视频、流媒体的圈子,没法躲开ffmpeg这个神级项目。 FFmpeg 是一个功能强大且广泛使用的多媒体处理工具。FFmpeg 具备众多出色的特性。它支持多种音频和视频格式的转换,能轻松将一种格式的文件转换为另一种,满足不同设备和应用的需求。不仅如此,它还可以进行视频的裁剪、…

你敢信!IP也能实现https

IP作为属于底层基础网络&#xff0c;在访问网站时IP是不可避免要使用到的。对于个别单位而言IP并不需要绑定域名&#xff0c;在进行互联网信息交互的过程中不可避免的会需要实现加密访问&#xff0c;在加密时使用符合IP的专用SSL证书就显得格外重要&#xff0c;毕竟在实现网络信…

SpringBoot入门:如何新建SpringBoot项目(保姆级教程)

在本文中&#xff0c;我们将演示如何新建一个基本的 Spring Boot 项目。写这篇文章的时候我还是很惊讶的&#xff0c;因为我发现有些java的初学者&#xff0c;甚至工作10年的老员工居然并不会新建一个SpringBoot项目&#xff0c;所以特别出了一篇文章来教大家新建一个SpringBoo…

六、1 TIM输出比较、PWM

1、英文缩写 OC&#xff08;Output Compare&#xff09;输出比较 IC&#xff08;Input Capture&#xff09;输入捕获 CC&#xff08;Capture/Compare&#xff09;输入捕获和输出比较单元 CNT计数器 CCR&#xff08;Capture/Compare Register&#xff09;捕获/比较寄存器 …

家政项目小程序的设计

管理员账户功能包括&#xff1a;系统首页&#xff0c;个人中心&#xff0c;用户管理&#xff0c;家政人员管理&#xff0c;家政服务管理&#xff0c;咨询信息管理&#xff0c;咨询服务管理&#xff0c;家政预约管理&#xff0c;留言板管理&#xff0c;系统管理 微信端账号功能…

如何查看Windows电脑密钥?Windows密钥一键获取

在数字时代&#xff0c;软件的安全性和授权问题日益受到重视。Windows操作系统&#xff0c;作为全球使用最广泛的电脑操作系统之一&#xff0c;其激活和授权机制对于确保软件的正版使用至关重要。Windows密钥&#xff0c;作为激活和验证操作系统正版性的关键&#xff0c;有时需…

Linux源码阅读笔记14-IO体系结构与访问设备

IO体系结构 与外设通信通常称为输入输出&#xff0c;一般缩写为I/O。在实现外设IO的时候&#xff0c;内核必须处理三个可能出现的问题&#xff1a; 必须根据具体的设备类型和模型&#xff0c;使用各种方法对硬件寻址。内核必须向用户应用程序和系统工具提供访问各种设备的方法…