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

news2024/9/22 21:20:06

原文链接

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

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

自己懒得粘贴图片了

环境:

wsl-kali-2024

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

测试文件: elf_amd64

    Arch:     amd64-64-little
    RELRO:    Partial RELRO
    Stack:    No canary found
    NX:       NX enabled
    PIE:      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.coloradmin.cn/o/1950731.html

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

相关文章

聚焦智慧出行,TDengine 与路特斯科技再度携手

在全球汽车行业向电动化和智能化转型的过程中&#xff0c;智能驾驶技术正迅速成为行业的焦点。随着消费者对出行效率、安全性和便利性的需求不断提升&#xff0c;汽车制造商们需要在全球范围内实现低延迟、高质量的数据传输和处理&#xff0c;以提升用户体验。在此背景下&#…

java学习--练习题

在类中this.属赋值&#xff0c;则外部创建对象调用其值也会随之一样 package com.test01;/* author:我与java相爱相杀---c语言梦开始的地方 今天又是努力学习的一天&#xff01;&#xff01;&#xff01;&#xff01; */ /*1. 在Frock类中声明私有的静态属性currentNum[int类型…

谷粒商城-性能压测

1.压力测试 在项目上线前对其进行压力测试(以每个微服务为单元) 目的:找到系统能承载的最大负荷,找到其他测试方法更难发现的错误(两种类型:内存泄漏,并发与同步). 1.性能指标 响应时间(Response Time (RT)): 响应时间 指用户从客户端发起一个请求开始,到客户端接收到从服务…

学习笔记-系统框图传递函数公式推导

目录 *待了解 现代控制理论和自动控制理论区别 自动控制系统的组成 信号流图 1、系统框图 1.1、信号线、分支点、相加点 1.2、系统各环节间的连接 1.3、 相加点和分支点的等效移动&#xff08;比较点、引出点&#xff09; 2、反馈连接公式推导 2.1、前向通路传递函数…

SpringCloud注册中心(Nacos,Ribbon)

微服务是由多个模块共同组成的&#xff0c;注册中心可以帮助我们沟通这些模块&#xff0c;帮助我们完成模块间的 常见的注册中心 Zookeeper zookeeper它是⼀个分布式服务框架&#xff0c;是Apache Hadoop 的⼀个⼦项⽬&#xff0c;它主要是⽤来解决分布式应 ⽤中经常遇到的⼀…

项目的小结

1.实现实时聊天 1.服务端建立一个ConcurrentHashMap<> 用来存储在线用户&#xff0c;用户账号和socket然后&#xff0c;如果有个人发了信息&#xff0c;就去数据库中查询&#xff0c;然后根据这个在线用户进行传递信息 服务端框架&#xff1a; public class ServerMain {…

转置卷积 transposed convolution

1. 转置卷积 转置卷积&#xff08;Transposed Convolution&#xff09;也叫Fractionally-strided Convolution和Deconvolution&#xff0c;但用的最多的是Transposed Convolution。 注意&#xff1a; 转置卷积不是卷积的逆运算&#xff0c;只会大小恢复为原本大小。转置卷积…

网络安全领域五大注入攻击类型介绍

在网络安全领域&#xff0c;注入攻击是一种常见的攻击方式&#xff0c;攻击者通过向应用程序发送恶意数据来操控应用程序的行为。以下跟随博主通过具体样例一起来掌握以下五种知名的注入攻击类型。 1. SQL注入&#xff08;SQL Injection&#xff09; 1.1. 概述 SQL注入是最常见…

pdf自动生成书签

PDF 自动生成书签&#xff0c;使用软件【PDF补丁丁】 软件官网&#xff1a; https://www.cnblogs.com/pdfpatcher/Github&#xff1a;https://github.com/wmjordan/PDFPatcher参考视频内容&#xff1a;使用PDFPatcher自动生成PDF书签 直接从软件官网下载压缩包&#xff0c;运…

Qt遇到qt自身组件找不到

比如在使用qtcharts的时候&#xff0c;找不到 解决方法&#xff1a; 在cmakelist中添加 find_package(Qt${QT_VERSION_MAJOR} COMPONENTS Charts REQUIRED) 是一个 CMake 命令&#xff0c;用于查找并配置 Qt 库中的特定组件。这条命令的作用是找到 Qt 的主要版本&#xff08;…

高性能 Java 本地缓存 Caffeine 框架介绍及在 SpringBoot 中的使用

在现代应用程序中&#xff0c;缓存是一种重要的性能优化技术&#xff0c;它可以显著减少数据访问延迟&#xff0c;降低服务器负载&#xff0c;提高系统的响应速度。特别是在高并发的场景下&#xff0c;合理地使用缓存能够有效提升系统的稳定性和效率。 Caffeine 是一个高性能的…

Java基础巩固——JDK 8、9新增接口的特性(接口中定义非抽象方法、静态方法和私有方法)

#Java学了这么久&#xff0c;项目也做了&#xff1f;基础知识还不巩固&#xff1f;快来关注我的这篇系列博客——Java基础复习巩固吧# 目录 引言 一、JDK8新特性&#xff1a;允许在接口中定义非抽象方法和静态方法。 注意事项 二、JDK9新特性&#xff1a;允许在接口中定义p…

【推研小灶】复旦与南大之间:一次独特的计算机保研之旅

写在前面 上午10点填完志愿等待复试通知&#xff0c;利用这段时间记录一下我简短的夏令营和预推免。今年变为线下之后&#xff0c;部分学校的入营情况、考核方式有明显变化。加上CS方向保研名额总体变多&#xff0c;形势有点小乱&#xff0c;甚至填报系统都在9.29中秋节当天&a…

AMQP-核心概念-3

本文参考以下链接摘录翻译&#xff1a; https://www.rabbitmq.com/tutorials/amqp-concepts 队列&#xff08;Queues&#xff09; AMQP 0-9-1模型中的队列和其他消息任务队列系统中的队列非常相似&#xff1a;它们用于存储被应用消费的消息。队列和交换机有一些相同的属性&…

2024.7.28周报

目录 摘要 ABSTRACT 一、文献阅读 一、题目 二、摘要 三、创新点 四、文献解读 一、Introduction 二、Saint-Venant方程 三、应用于水道建模的PINN 四、真实场景 五、结论 摘要 本周阅读了一篇题目为Physics-Informed Neural Networks for Modeling Water Flows …

免费【2024】springboot 毕业生学历证明系统

博主介绍&#xff1a;✌CSDN新星计划导师、Java领域优质创作者、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和学生毕业项目实战,高校老师/讲师/同行前辈交流✌ 技术范围&#xff1a;SpringBoot、Vue、SSM、HTML、Jsp、PHP、Nodejs、Python、爬虫、数据可视化…

vite5+vue3开发阅读APP实战笔记20240725

目前界面长成这样&#xff1a; 配置别名 修改vite.config.js import {defineConfig} from vite import vue from vitejs/plugin-vue import path from "path"// https://vitejs.dev/config/ export default defineConfig({server: {open: true,port: 8088,},plug…

Can we Deploy Web Application in Azure OpenAI of Production Level

题意&#xff1a;我们可以在Azure OpenAI中部署生产级别的Web应用程序吗 问题背景&#xff1a; I have created azure ai search service and used Text split skillset and made index. I also deployed a web Application but have a question that If I want to create to …

嵌入式Linux学习: 设备树实验

设备树&#xff08;DeviceTree&#xff09;是一种硬件描述机制&#xff0c;用于在嵌入式系统和操作系统中描述硬件设备的特性、连接关系和配置信息。它提供了一种与平台无关的方式来描述硬件&#xff0c;使得内核与硬件之间的耦合度降低&#xff0c;提高了系统的可移植性和可维…

实战解读:Llama Guard 3 Prompt Guard

前序研究&#xff1a;实战解读&#xff1a;Llama 3 安全性对抗分析 近日&#xff0c;腾讯朱雀实验室又针对 Llama 3.1 安全性做了进一步解读。 2024年7月23日晚&#xff0c;随着Llama3.1的发布&#xff0c;Meta正式提出了“Llama系统”的概念&#xff0c;通过系统级的安全组件对…