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,一经查实,立即删除!

相关文章

Elasticsearch概念及ELK安装

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

python题解

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

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

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

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

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

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

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

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

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

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

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

go语言开发Prometheus Exporter(DM数据库)

一、介绍 源码步骤基于dameng_exporter源码讲解&#xff0c;看完本篇文章可以直接进行二次开发。 dameng exporter的开源地址&#xff1a;https://github.com/gy297879328/dameng_exporter&#xff08;可直接对接prometheusgrafana 提供表盘&#xff09; 开发一个exporter 其…

Linux中的三类读写函数

文件IO和标准IO的区别 遵循标准&#xff1a; 文件IO遵循POSIX标准&#xff0c;主要在类UNIX环境下使用。标准IO遵循ANSI标准&#xff0c;具有更好的可移植性&#xff0c;可以在不同的操作系统上重新编译后运行。可移植性&#xff1a; 文件IO的可移植性相对较差&#xff0c;因为…

基于大模型零代码1小时完成国标数据分级分类近义词库构建及思考

1. 任务背景及困难分析 因项目要求&#xff0c;需要对国家标准国民经济行业分类-GB/T 4754-2017【1】进行近义词库的构建&#xff0c;时间非常紧&#xff0c;只给了很短时间进行处理&#xff0c;目标是构建一份中等粒度的行业近义词库。 搁在以前&#xff0c;可能需要点时…

Linux 安装mysql-client-core-8.0

在Linux上安装mysql-client-core-8.0 安装流程 下面是安装mysql-client-core-8.0的步骤和相应的命令&#xff1a; 步骤1&#xff1a;更新系统软件源 我们首先需要更新系统的软件源&#xff0c;以确保我们能够获取到最新的软件包列表。使用以下命令更新软件源&#xff1a; …

Ansible——inventory 主机清单

1、inventory 含义 Inventory支持对主机进行分组&#xff0c;每个组内可以定义多个主机&#xff0c;每个主机都可以定义在任何一个或多个主机组内。 如果是名称类似的主机&#xff0c;可以使用列表的方式标识各个主机。 vim /etc/ansible/hosts [webservers] 192.168.20.11:222…

平凯星辰亮相 2024 中国国际金融展,发布银行交易明细查询白皮书

7 月 19 日至 21 日&#xff0c;备受瞩目的 2024 中国国际金融展&#xff08;以下简称金融展&#xff09;在北京国家会议中心隆重举办。作为中国乃至亚洲最大的金融科技展会&#xff0c;本届金融展以“数字金融引领未来&#xff0c;守正创新共筑金融新生态”为主题&#xff0c;…

C++_单例模式

目录 1、饿汉方式实现单例 2、懒汉方式实现单例 3、单例模式的总结 结语 前言&#xff1a; 在C中有许多设计模式&#xff0c;单例模式就是其中的一种&#xff0c;该模式主要针对类而设计&#xff0c;确保在一个进程下该类只能实例化出一个对象&#xff0c;因此名为单例。而…

temu数据分析怎么做,temu选品数据分析怎么做

在竞争激烈的电商市场中&#xff0c;数据分析已成为商家提升销售业绩、优化经营策略的重要工具。特别是对于Temu平台的卖家而言&#xff0c;掌握数据分析技巧&#xff0c;特别是选品数据分析&#xff0c;更是至关重要。本文将为您详细解析如何在Temu平台上进行数据分析&#xf…

Docker 安全及日志管理(包含SSL证书)

目录 一、Docker 存在的安全问题 二、Docker 架构缺陷与安全机制 三、Docker 安全基线标准 四、容器相关的常用安全配置方法 五、限制流量流向 六、镜像安全 七、DockerClient 端与 DockerDaemon 的通信安全 https的单向认证流程 https的双向认证流程 八、DockerClie…

Ubuntu 22.04.4 LTS (linux) GoAccess 分析 Nginx 日志

1 安装goaccess sudo apt-get update sudo apt-get install goaccess 2 控制台运行 goaccess -a -d -f /usr/local/openresty/nginx/logs/access.log -p /etc/goaccess/goaccess.conf #sudo vim /etc/goaccess/goaccess.conf time-format %H:%M:%S date-format %d/%b…

iOS ------ Block的相关问题

Block的定义 Block可以截获局部变量的匿名函数&#xff0c; 是将函数及其执行上下文封装起来的对象。 Block的实现 通过Clang将以下的OC代码转化为C代码 // Clang xcrun -sdk iphoneos clang -arch arm64 -rewrite-objc main.m//main.m #import <Foundation/Foundation.…

3.2、数据结构-数组、矩阵和广义表

数组结构 数组是定长线性表在维度上的扩展,即线性表中的元素又是一个线性表。N维数组是一种“同构”的数据结构,其每个数据元素类型相同、结构一致。 一个m行n列的数组表示如下: 其可以表示为行向量形式&#xff08;一行一行的数据&#xff09;或者列向量形式&#xff08;一…

Nginx 怎样处理请求的故障转移?

&#x1f345;关注博主&#x1f397;️ 带你畅游技术世界&#xff0c;不错过每一次成长机会&#xff01; 文章目录 Nginx 怎样处理请求的故障转移&#xff1f;一、理解故障转移的重要性二、Nginx 中的故障检测机制三、Nginx 中的请求分配策略四、Nginx 中的故障转移实现方式五、…