代码还原之 函数

指令堆里逆向出来的代码有歧义,有三处返回,有嵌套IF语句,故推断出是个函数;

    #if 0
    /*27ec:	48 8d 3d 58 39 00 00 	lea    0x3958(%rip),%rdi        # 614b <_IO_stdin_used@@Base+0x14b> // rdi="COLUMNS"
    27f3:	e8 e8 fb ff ff       	callq  23e0 <getenv@plt>*/	// getenv(rdi)
    char *ptr_strtol;
    struct winsize p_0xa8;
        /*struct winsize
        {
            unsigned short ws_row; // 窗口字符行数。
            unsigned short ws_col; // 窗口字符列数。
            unsigned short ws_xpixel; // 窗口宽度,象素值。
            unsigned short ws_ypixel; // 窗口高度,象素值。
        };*/
    
	char *p_getenv = getenv("COLUMNS");

    /*27f8:	48 85 c0             	test   %rax,%rax			// rax="113"
    27fb:	74 09                	je     2806 <__sprintf_chk@plt+0x96>	// no
    27fd:	80 38 00             	cmpb   $0x0,(%rax)			// 0-0x31, so zf=0
    2800:	0f 85 1e 07 00 00    	jne    2f24 <__sprintf_chk@plt+0x7b4>*/	// if zf=0 than jump
    
	if ((p_getenv != NULL) && (*p_getenv != 0)) {
			// goto 2f24 --> 283a
            col = strtol(p_getenv, &ptr_strtol, 0);
            printf("col = %d\n", col);

            if ( (!*ptr_strtol) && (col > 0) && (col < 0x7ffffffd))

	} else {

    /*2806:	48 8d 94 24 a8 00 00 	lea    0xa8(%rsp),%rdx  // rdx=(rsp+0xa8)=struct winsize p_0xa8
    280d:	00 
    280e:	be 13 54 00 00       	mov    $0x5413,%esi
    2813:	bf 01 00 00 00       	mov    $0x1,%edi
    2818:	31 c0                	xor    %eax,%eax
    281a:	e8 51 fd ff ff       	callq  2570 <ioctl@plt>
    281f:	41 89 c0             	mov    %eax,%r8d*/          // r8d=ret,把返回值存起来, 此处有可能是一个函数调用的返回。
    
        // include/uapi/asm-generic/ioctls.h:38:#define TIOCGWINSZ 0x5413
        ret = ioctl(1, 0x5413, &p_0xa8);
        printf("ret = %d, 0x%x\n", ret, p_0xa8.ws_row);    
        col = 0x84;
    
    /*2822:	b8 84 00 00 00       	mov    $0x84,%eax   // 0x84=132
    2827:	45 85 c0             	test   %r8d,%r8d    // r8d=ret
    282a:	78 0e                	js     283a <__sprintf_chk@plt+0xca>    SF = 1 负数, jump
    282c:	0f b7 8c 24 aa 00 00 	movzwl 0xaa(%rsp),%ecx  // (rsp+0xaa)=p_0xa8.ws_col,通过查看内存值可以判断结构的成员及大小
    2833:	00 
    2834:	66 85 c9             	test   %cx,%cx          // cx=cx&0xff
    2837:	0f 45 c1             	cmovne %ecx,%eax */     // cmovne 不等传送
        if (ret >= 0) {
            if (p_0xa8.ws_col != 0) {
                col = p_0xa8.ws_col;
            }
        }
    }
    #endif

    col = get_ws_col();

    /*283a:	48 8d 35 2b 3a 00 00 	lea    0x3a2b(%rip),%rsi        # 626c <_IO_stdin_used@@Base+0x26c> // ""
    2841:	bf 06 00 00 00       	mov    $0x6,%edi
    2846:	89 05 78 6a 00 00    	mov    %eax,0x6a78(%rip)        # 92c4 <_IO_stdin_used@@Base+0x32c4> // 0x55555555684c+0x6a78=0x55555555d2c4=113
    284c:	e8 4f fe ff ff       	callq  26a0 <setlocale@plt>*/

int get_ws_col()
{
    char *ptr_strtol;
    struct winsize p_0xa8 = {0};
    int col = 0;

    char *p_getenv = getenv("COLUMNS");

    if ((p_getenv != NULL) && (*p_getenv != 0)) {
        col = strtol(p_getenv, &ptr_strtol, 0);
        printf("col = %d\n", col);

        if ( (!*ptr_strtol) && (col > 0) && (col < 0x7ffffffd)) {
            return col;
        }
    }

    if (ioctl(1, 0x5413, &p_0xa8) >= 0) {
        if (p_0xa8.ws_col != 0) {
            return p_0xa8.ws_col;
        }
    }

    reutrn 0x84;
}

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

“.网址”中文域名成为中国企业互联网发展新潮流

随着互联网的不断发展和英文域名资源的日益枯竭&#xff0c;中文域名在国内迅速崛起。 中文域名不可重复注册&#xff0c;具有一经注册全球唯一的属性。 为维护自主品牌权益&#xff0c;加强中文域名知识产权保护已成为企业的重要任务。 现代知识产权法的价值已经从西方文化价…

Docker入门——安装部署(openEuler)、镜像加速

安装 1&#xff09;依赖的基础环境 64 位CPU Linux kernel(内核) 3.10 Linux kernel cgroups and namespaces 我用的是openEuler&#xff0c;所以直接yum安装(推荐&#xff0c;因为二进制安装&#xff0c;docker命令中补全操作要另外安装软件) [rootlocalhost ~]# yum -y…

电动汽车路由问题的自适应精英遗传算法与改进的邻居路由初始化

英文&#xff1a;Adaptive Elitist Genetic Algorithm With Improved Neighbor Routing Initialization for Electric Vehicle Routing Problems(2021) 摘要 本文将精英遗传算法应用于有时间窗口的电动汽车路由问题。在初始化方面&#xff0c;本文提出了一种改进的邻居路由初始…

StarUML6.0.1使用

1. 简介 作为一个软件开发人员&#xff0c;平时免不了做一定的软件设计&#xff0c;标准做法就是采用UML来设计&#xff1a; 讨论功能流程时采用时序图、活动图来表达&#xff1b;做业务功能架构时采用组件图来表达&#xff1b;做系统部署架构时采用部署图来表达&#xff1b;做…

浅谈结构化数据、非结构化数据,关系数据库、非关系数据库

结构化数据和非结构化数据两者之间存在一定的区别。以下是具体分析&#xff1a; - **结构化数据**&#xff1a;通常指的是那些组织严谨、格式规范统一的数据&#xff0c;它们存储在关系数据库中&#xff0c;可以通过二维表的形式进行逻辑表达。这类数据有明确的数据模型&#…

【小白学机器学习7】相关系数R,决定系数R2和SST=SSR+SSE, 离差,偏差,方差,标准差,编译系数,标志误。

目录 1 各种数据指标&#xff0c;分类整理 1.0 关于数据/值有3种 1.1 第1类&#xff1a;描述一堆数据特征的指标&#xff1a;集中度&#xff0c;离散度&#xff0c;形状特征 1.2 第2类&#xff1a;判断预测y值和观测值差距的指标 1.3 第3类&#xff1a;描述误差的各种指标…

容器化软件应用简化传统设备的连接

| Docker容器如何简化工业物联网解决方案 制造和包装工厂可通过集成IT和OT技术来改善运营&#xff0c;从而释放预测性维护、数据分析以及接入强大的企业管理应用等优势。然而&#xff0c;对于缺乏员工、时间或资源的企业而言&#xff0c;实施工业物联网解决方案并不容易。对此…

HashSet在添加元素时,是如何判断元素重复的? (原理详解 | 易错案例)

前言&#xff1a;我们知道Set中所存储的元素是不重复的&#xff0c;那么Set接口的实现类HashSet在添加元素时是怎么避免重复的呢&#xff1f; HashSet在添加元素时&#xff0c;是如何判断元素重复的? ● 在底层会先调用hashCode()&#xff0c;注意&#xff0c;Obje…

有名信号量、网络协议模型、UDP编程发送端

我要成为嵌入式高手之3月5日Linux高编第十五天&#xff01;&#xff01; ______________________________________________________ 学习笔记 有名信号量 1、创建semget #include <sys/types.h> #include <sys/ipc.h> #include <sys/sem.h> int semget(…

js SheetJS 合并表格导出到同一个excel中

最近有个需求,我在一个页面显示了4个表格, 然后合并导出到excel文件中 四个表,四个sheet,一个excel文件 最后导出时这样: 实现: 1,页面有个导出的checkbox,勾选则导出,不勾选不处理 2,在一个函数中,集中处理四个表数据获取,并将结果返回出来 //获取数据后返回为…

开展庆2024年“三八”国际妇女节系列纪念活动怎样向媒体投稿?

为了向媒体投稿,庆祝2024年“三八”国际妇女节系列纪念活动,你可以遵循以下步骤: 策划与准备: 确定纪念活动的主题和目标,例如提升女性权益、表彰女性成就、促进性别平等。 策划一系列活动,如研讨会、表彰仪式、展览、讲座等,确保内容丰富多样。 准备相关的背景资料、活动介…

PyTorch搭建LeNet神经网络

函数的参数 1、PyTorch Tensor的通道排序 [batch, channel, height, width] batch: 要处理的一批图像的个数 channel: 通道数&#xff08;一般是R G B 三个通道&#xff09; height: 图像的高度 width: 图像的宽度 2.Conv 2d 卷积层的参数 [in_channels, out_channels, ke…

从零开始学习Netty - 学习笔记 -Netty入门【自定义编码器解码器】

自定义编码器解码器 通过一个简单案例&#xff0c;我们自己去实现一个编码器 和解码器 实现思路 编码器&#xff08;Encoder&#xff09;实现&#xff1a; 在编码器中&#xff0c;实现了 ByteToMessageCodec<Message> 类&#xff0c;并覆盖了 encode() 方法来处理消息的编…

【HarmonyOS】Dev Eco Studio4.0安装教程

目录 下载安装开发工具配置 下载 Dev Eco Studio4.0下载连接→https://developer.huawei.com/consumer/cn/next/deveco-studio/ 安装 点击Next 选择安装目录。点击Next 勾选创建桌面快捷方式和环境变量&#xff0c;点击Next 点击Install&#xff0c;安装 等待安装 选…

Node.js最准确历史版本下载(以下载Node.js16.17.1版本为例)

先进入官网:Node.js https://nodejs.org/en 括号中LTS代表稳定版本. 嫌其他冗余博客帖子多&#xff0c;找起来费眼睛,可以到/release下载:Node.js,在blog后面加/release https://nodejs.org/en/blog/release/ 点击next翻页,跟上面同样的步骤

做分析用什么工具

做分析用什么工具 导读 数据分析是数据辅助决策的最后一公里&#xff0c;是最终的数据可视化展示与探索分析的部分&#xff0c;选择使用最适合的数据展示方式&#xff0c;可以帮助分析人员大大提升分析效率。 问题&#xff1a; ● 纠结选择哪个工具 ● 纠结从哪里学起&#x…

Java异常的介绍与处理

一、异常与错误(Error)的区别&#xff1a; 异常&#xff08;Exception&#xff09;和错误&#xff08;Error&#xff09;都是指程序执行过程中的问题&#xff0c;但它们之间存在一些重要的区别。 异常&#xff08;Exception&#xff09;&#xff1a; 异常表示程序在执行期间可能…

Memcached介绍和详解

Memcached介绍 Memcached是一个高性能的分布式内存对象缓存系统&#xff0c;它通过在内存中缓存数据来减少数据库负载&#xff0c;加快动态Web应用程序的响应速度。 以下是Memcached的一些关键特点和作用&#xff1a; 分布式缓存&#xff1a;Memcached是分布式的&#xff0c;不…

Android高级工程师面试实战,三幅图给你弄懂EventBus核心原理

阿里技术一面-35min 自我介绍 Android 有没有遇到OOM问题(有遇到内存泄漏问题)Handler机制ThreadLocalActivity启动到加载View过程View绘制过程LinearLayout (wrap_content) & TextView (match_parent) 最终结果???OKHttp(1. 为什么选择它&#xff1f; 2. 性能了解不…

阿里云服务器几核几G怎么选择?带宽多少合适?

阿里云服务器配置怎么选择&#xff1f;CPU内存、公网带宽和系统盘怎么选择&#xff1f;个人开发者或中小企业选择轻量应用服务器、ECS经济型e实例&#xff0c;企业用户选择ECS通用算力型u1云服务器、ECS计算型c7、通用型g7云服务器&#xff0c;阿里云服务器网aliyunfuwuqi.com整…
最新文章