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://www.mzph.cn/bicheng/50504.shtml

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

相关文章

mac安装Whisper

Whisper 官方git https://github.com/openai/whisper?tabreadme-ov-file 基本上参考官方的安装流程 pip3 install -U openai-whisper pip3 install githttps://github.com/openai/whisper.git pip3 install --upgrade --no-deps --force-reinstall githttps://github.com/…

牛客周赛52--E小红的图上加边(联通块)

链接&#xff1a;登录—专业IT笔试面试备考平台_牛客网 来源&#xff1a;牛客网 题目描述 \,\,\,\,\,\,\,\,\,\,小红有一张 nnn 个点 mmm 条边的无向图&#xff0c;每个节点的权值是 aia_iai​。           \,\,\,\,\,\,\,\,\,\,现在小红希望加边把这个图连成连通…

Elasticsearch概念及ELK安装

1、Elasticsearch是什么 它是elastic技术栈中的一部分。完整的技术栈包括&#xff1a; Elasticsearch&#xff1a;用于数据存储、计算和搜索 Logstash/Beats&#xff1a;用于数据收集 Kibana&#xff1a;用于数据可视化 整套技术栈被称为ELK&#xff0c;经常用来做日志收集…

ansible的role目录结构及用法

目录 目录结构介绍案例 目录结构介绍 可以通可以通过使用 ansible-galaxy 命令再当前目录自动生成 role 的基本目录结构。 myrole为文件名&#xff08;角色名&#xff09; ansible-galaxy init myrole如果没有安装Ansible Galaxy&#xff0c;你可以使用以下命令安装&#xff…

Python 函数的参数形式

Python 函数的参数形式 Python 函数的参数有多种形式&#xff0c;每种形式在不同的场景下使用。我们主要介绍以下几种&#xff1a; 位置参数关键字参数默认参数可变位置参数&#xff08;*args&#xff09;可变关键字参数&#xff08;**kwargs&#xff09; 1. 位置参数 位置…

python题解

宽度与对齐 输出455、-123、987654&#xff0c;宽度为5&#xff0c;分别左对齐和右对齐 格式 输入格式&#xff1a; 无 输出格式&#xff1a; 输出为整型&#xff0c;空格分隔。每个数的输出占一行 样例 1 输入&#xff1a; 无 复制 输出&#xff1a; 455 455 -123 -123 98…

Vue的SSR和预渲染:提升首屏加载速度与SEO效果

引言 在现代Web应用开发中,首屏加载速度和搜索引擎优化(SEO)是衡量应用性能的重要指标。Vue.js 作为流行的前端框架,提供了服务器端渲染(SSR)和预渲染(prerendering)两种技术来提升这些指标。本文将深入探讨如何使用 Vue 的 SSR 和预渲染技术,提供详细的代码示例和最…

FFmpeg源码:av_probe_input_format3函数分析

一、av_probe_input_format3函数的声明 av_probe_input_format3函数声明在FFmpeg源码&#xff08;本文演示用的FFmpeg源码版本为5.0.3&#xff09;的头文件libavformat/avformat.h中&#xff1a; /*** Guess the file format.** param is_opened Whether the file is already…

Go语言的数据结构

数据结构 数组 支持多维数组&#xff0c;属于值类型&#xff0c;支持range遍历 例子&#xff1a;随机生成长度为10整数数组 package main import ("fmt""math/rand" ) // 赋值 随机获取100以内的整数 func RandomArrays() {var array [10]int //声明var…

【MySQL进阶篇】锁:全局锁、表级锁以及行级锁

一、锁的概述 锁是计算机协调多个进程或线程并发访问某一资源的机制。在数据库中除传统的计算资源&#xff08;CPU、RAM、I/O&#xff09;的争用以外&#xff0c;数据也是一种供许多用户共享的资源。如何保证数据并发访问的一致性、有效性是所有数据库必须要解决的一个问题&am…

C语言11 结构体、共用体、枚举和重定义

目录 结构体&#xff08;Struct&#xff09; 定义结构体 声明和初始化结构体变量 访问结构体成员 嵌套结构体 指向结构体的指针 共用体&#xff08;Union&#xff09; 定义共用体 声明和使用共用体 重定义&#xff08;Typedef&#xff09; 定义类型别名 使用类型别…

Person Re-Identification(Re-ID)的分类

行人重识别&#xff08;Person Re-Identification, Re-ID&#xff09;是计算机视觉和深度学习中的一个重要任务&#xff0c;旨在通过图像或视频中的行人外观信息来识别和追踪同一个人在不同摄像头视角下的出现。根据任务的不同&#xff0c;行人重识别可以分为以下几类&#xff…

室内消防逃生通道占用检测AI算法:科技筑防,守护生命通道

随着城市化进程的加快&#xff0c;高层建筑和大型公共场所的数量急剧增加&#xff0c;消防安全问题愈发凸显。其中&#xff0c;室内消防逃生通道的畅通性直接关系到火灾发生时人员的安全疏散。然而&#xff0c;由于各种原因&#xff0c;如杂物堆放、车辆停放等&#xff0c;消防…

nacos 2.3.2 若依使用mysql

1&#xff09;从官网下载 nacos&#xff0c;如果下载慢&#xff0c;关注从本人发布上传下载也可以 2&#xff09;修改配置文件 【config】-【application.properties】 ### Deprecated configuration property, it is recommended to use spring.sql.init.platform replaced.…

SpringBoot实现定时任务-@Scheduled

在Java编程中&#xff0c;Scheduled 注解是 Spring Framework 提供的一个用于定时任务的注解。 Scheduled可以将一个方法配置为定时执行的任务。 以下是一些基本用法&#xff1a; 1.固定速度 fixedRate指两次任务的开始时间间隔。所以存在第二次任务开始时&#xff0c;第一…

LeetCode 2844.生成特殊数字的最少操作(哈希表 + 贪心)

给你一个下标从 0 开始的字符串 num &#xff0c;表示一个非负整数。 在一次操作中&#xff0c;您可以选择 num 的任意一位数字并将其删除。请注意&#xff0c;如果你删除 num 中的所有数字&#xff0c;则 num 变为 0。 返回最少需要多少次操作可以使 num 变成特殊数字。 如…

mysql各个参数调整

innodb_lock_wait_timeout 事务锁释放时间

前端知识--前端访问后端技术Ajax及框架Axios

一、异步数据请求技术----Ajax Ajax是前端访问后端的技术&#xff0c;为异步请求&#xff08;不刷新页面&#xff0c;请求数据&#xff0c;只更新局部数据&#xff09;。 例如&#xff1a;在京东网站中搜索电脑&#xff0c;就会出现一些联想搜索&#xff0c;但此时页面并没有…

【技术支持】canvas转换为图片或PDF保存电脑

注意&#xff1a;有些网站可能由于canvas跨域污染问题&#xff0c;无法使用toBlob&#xff0c;所以无法转换 开发者工具中&#xff0c;选中需要转换的canvas元素&#xff08;使其可以使用$0语法&#xff09; 控制台输入如下代码 $0.toBlob(function (blob) {var link document…

Window下CLion实现本机通过socket通信-C++

1.引言-什么是socket socket即套接字&#xff0c;用于描述地址和端口&#xff0c;是一个通信链的句柄。应用程序通过socket向网络发出请求或者回应。 sockets(套接字)编程有三种&#xff0c;流式套接字&#xff08;SOCK_STREAM&#xff09;&#xff0c;数据报套接字&#xff…