C标准库——字符串函数反汇编分析

news2024/11/28 18:48:07

1、前置概念补充 

test:逻辑与,如果是1,zf就是1,如果是0,zf就是0 

可以还原成等价的高级语言,理解代码逻辑,但是不一定是源代码

大写的A:41,小写a:61

ascii:a:0x61        >16^2

unicode:a:0x0061        >16^4

unicode文件的开头是ff fe,0d 00 0a 00构成了一个换行符相当于\r\n回车+换行

 .txt代码段,.data数据段,.rdata只读常量区

char str[]="hello"

strlen算出的字符串长度是不包含最后一个字符\0的:5

sizeof(str)        >6

release下的strlen的反汇编代码

按a是以ascii呈现内存

strcpy函数逆向:

 main当中有两个全局的地址:

按下n可以对变量重命名

在release版本当中strcpy已经被内联了,被编译成内联函数的形式,并做了一些优化

ida当中右键进入主函数,点击去常量,按a变成字符串形式,然后按下esc来返回

ida打开会生成四个数据库文件,如果修改的话直接打包保存,到时候直接打开idb文件就好了

collect garbege:当ida文件比较大了,想节省空间,就选择这个选项,

相同返回0,不同返回-1

字符串chaz strstr返回下标

这样有利于在反汇编代码当中去识别字符串操作的函数,因为发布版他都是以内联的形式出现,不像在debug版本当中这么明显地显示出来,这样我们拿到一个陌生的程序就可以识别出来他是对字符串进行了什么样的操作是拷贝还是比较 

vs2019下的strcpy函数:直接以内联形式调用不具备参考意义

2、strlen函数逆向分析

test cl,cl的作用就是判断cl是否为0

00FA1040 >/$  55            push ebp
00FA1041  |.  8BEC          mov ebp,esp
00FA1043  |.  83EC 08       sub esp,0x8
00FA1046  |.  A1 0021FA00   mov eax,dword ptr ds:[0xFA2100]          ;  hello
00FA104B  |.  8945 F8       mov [local.2],eax
00FA104E  |.  66:A1 0421FA0>mov ax,word ptr ds:[0xFA2104]            ;  o
00FA1054  |.  66:8945 FC    mov word ptr ss:[ebp-0x4],ax
00FA1058  |.  8D45 F8       lea eax,[local.2]
00FA105B  |.  8D50 01       lea edx,dword ptr ds:[eax+0x1]
00FA105E  |.  66:90         nop
00FA1060  |>  8A08          /mov cl,byte ptr ds:[eax]
00FA1062  |.  40            |inc eax
00FA1063  |.  84C9          |test cl,cl
00FA1065  |.^ 75 F9         \jnz short 汇编代码.00FA1060
00FA1067  |.  2BC2          sub eax,edx
00FA1069  |.  50            push eax
00FA106A  |.  68 0821FA00   push 汇编代码.00FA2108                       ;  hhh%d\n
00FA106F  |.  E8 9CFFFFFF   call 汇编代码.printfTStartupr_initialize_mta>
00FA1074  |.  68 1021FA00   push 汇编代码.00FA2110                       ; /pause
00FA1079  |.  FF15 7820FA00 call dword ptr ds:[<&api-ms-win-crt-runt>; \system
00FA107F  |.  83C4 0C       add esp,0xC
00FA1082  |.  33C0          xor eax,eax
00FA1084  |.  8BE5          mov esp,ebp
00FA1086  |.  5D            pop ebp
00FA1087  \.  C3            retn

3、strcpy函数逆向分析

字符串赋值有时候一次性赋值不完,这种是使用字符数组来存储的

00DB104E  |.  45            inc ebp                                  ;  o
00DB104F  |?  FC            cld
00DB1050  |?  A1 0021DB00   mov eax,dword ptr ds:[0xDB2100]          ;  hello
00DB1055  |?  8945 F4       mov [local.3],eax
00DB1058  |.  66:A1 0421DB0>mov ax,word ptr ds:[0xDB2104]            ;  o

 

00DB1040 >/$  55            push ebp
00DB1041  |.  8BEC          mov ebp,esp
00DB1043  |.  83EC 0C       sub esp,0xC
00DB1046  |.  A1 0430DB00   mov eax,dword ptr ds:[__security_cookie_>;  hello
00DB104B  |.  33C5          xor eax,ebp
00DB104D  |?  8945 FC       mov [local.1],eax
00DB1050  |?  A1 0021DB00   mov eax,dword ptr ds:[0xDB2100]          ;  hello
00DB1055  |?  8945 F4       mov [local.3],eax
00DB1058  |.  66:A1 0421DB0>mov ax,word ptr ds:[0xDB2104]            ;  o
00DB105E  |.  66:8945 F8    mov word ptr ss:[ebp-0x8],ax
00DB1062  |.  33C0          |xor eax,eax
00DB1064  |?  0f1f40 00     nop dword ptr ds:[eax]
00DB1068  |?  0f1f8400 0000>nop dword ptr ds:[eax+eax]
00DB1070  |?  8A88 0821DB00 mov cl,byte ptr ds:[eax+0xDB2108]        ;  world
00DB1076  |?  8D40 01       lea eax,dword ptr ds:[eax+0x1]
00DB1079  |.  884C05 F3     mov byte ptr ss:[ebp+eax-0xD],cl         ; \system
00DB107D  |?  84C9          test cl,cl
00DB107F  |.^ 75 EF         jnz short 汇编代码.00DB1070
00DB1081  |?  8D45 F4       lea eax,[local.3]
00DB1084  |.  50            push eax
00DB1085  |?  68 1021DB00   push 汇编代码.00DB2110                       ;  hhh%s\n
00DB108A   ?  E8 81FFFFFF   call 汇编代码.printfTStartupr_initialize_mta>
00DB108F   ?  68 1821DB00   push 汇编代码.00DB2118                       ;  pause
00DB1094   ?  FF15 7820DB00 call dword ptr ds:[<&api-ms-win-crt-runt>;  ucrtbase.system
00DB109A   ?  8B4D FC       mov ecx,dword ptr ss:[ebp-0x4]           ;  kernel32.BaseThreadInitThunk
00DB109D   ?  83C4 0C       add esp,0xC
00DB10A0   ?  33CD          xor ecx,ebp
00DB10A2   ?  33C0          xor eax,eax
00DB10A4   .  E8 04000000   call 汇编代码.__security_check_cookiepresent>
00DB10A9   .  8BE5          mov esp,ebp
00DB10AB   ?  5D            pop ebp                                  ;  kernel32.762D00C9
00DB10AC   ?  C3            retn

使用两个字符数组的情况:

#include <iostream>
#pragma warning (disable:4996)
using namespace std;

int main()
{
    int n;
    char str1[] = "hello";
    char str2[] = "world";
    strcpy(str1, str2);
    printf("hhh%s\n", str1);
    system("pause");
    return 0;
}

 反汇编:

009F1040 >/$  55            push ebp
009F1041  |.  8BEC          mov ebp,esp
009F1043  |.  83EC 14       sub esp,0x14
009F1046  |.  A1 04309F00   mov eax,dword ptr ds:[__security_cookie_>;  hello
009F104B  |.  33C5          xor eax,ebp
009F104D  |?  8945 FC       mov [local.1],eax
009F1050  |?  A1 00219F00   mov eax,dword ptr ds:[0x9F2100]          ;  hello
009F1055  |?  8945 F4       mov [local.3],eax
009F1058  |.  0FB705 04219F>movzx eax,word ptr ds:[0x9F2104]         ;  o
009F105F  |?  66:8945 F8    mov word ptr ss:[ebp-0x8],ax
009F1063  |.  A1 08219F00   |mov eax,dword ptr ds:[0x9F2108]         ;  world
009F1068  |?  8945 EC       mov [local.5],eax
009F106B  |?  0FB705 0C219F>movzx eax,word ptr ds:[0x9F210C]         ;  d
009F1072  |?  66:8945 F0    mov word ptr ss:[ebp-0x10],ax
009F1076  |?  33C0          xor eax,eax
009F1078  |?  0f1f8400 0000>nop dword ptr ds:[eax+eax]
009F1080  |?  8A4C05 EC     mov cl,byte ptr ss:[ebp+eax-0x14]
009F1084  |.  8D40 01       lea eax,dword ptr ds:[eax+0x1]
009F1087  \.  884C05 F3     mov byte ptr ss:[ebp+eax-0xD],cl
009F108B   ?  84C9          test cl,cl
009F108D   ?^ 75 F1         jnz short 汇编代码.009F1080
009F108F   ?  8D45 F4       lea eax,dword ptr ss:[ebp-0xC]           ;  pause
009F1092   ?  50            push eax
009F1093   ?  68 10219F00   push 汇编代码.009F2110                       ;  hhh%s\n
009F1098   ?  E8 73FFFFFF   call 汇编代码.printfTStartupr_initialize_mta>
009F109D   ?  68 18219F00   push 汇编代码.009F2118                       ;  pause
009F10A2   ?  FF15 78209F00 call dword ptr ds:[<&api-ms-win-crt-runt>;  ucrtbase.system
009F10A8   ?  8B4D FC       mov ecx,dword ptr ss:[ebp-0x4]           ;  kernel32.BaseThreadInitThunk
009F10AB   ?  83C4 0C       add esp,0xC
009F10AE   .  33CD          xor ecx,ebp
009F10B0   .  33C0          xor eax,eax
009F10B2   ?  E8 04000000   call 汇编代码.__security_check_cookiepresent>
009F10B7   .  8BE5          mov esp,ebp
009F10B9   .  5D            pop ebp                                  ;  kernel32.762D00C9
009F10BA   ?  C3            retn

5、strcmp函数逆向

#include <iostream>
#pragma warning (disable:4996)
using namespace std;

int main()
{
    int n;
    char str1[] = "hello";
    char str2[] = "world";
    n = strcmp(str1, str2);

    printf("hhh%d\n", n);
    system("pause");
    return 0;
}

汇编代码:

00FD1040 >/$  55            push ebp
00FD1041  |.  8BEC          mov ebp,esp
00FD1043  |.  83EC 10       sub esp,0x10
00FD1046  |.  A1 0021FD00   mov eax,dword ptr ds:[0xFD2100]          ;  hello
00FD104B  |.  8D4D F0       lea ecx,[local.4]
00FD104E  |.  8945 F0       mov [local.4],eax
00FD1051  |.  0FB705 0421FD>movzx eax,word ptr ds:[0xFD2104]         ;  o
00FD1058  |.  66:8945 F4    mov word ptr ss:[ebp-0xC],ax
00FD105C  |.  A1 0821FD00   mov eax,dword ptr ds:[0xFD2108]          ;  world
00FD1061  |.  8945 F8       mov [local.2],eax
00FD1064  |.  0FB705 0C21FD>movzx eax,word ptr ds:[0xFD210C]         ;  d
00FD106B  |.  66:8945 FC    mov word ptr ss:[ebp-0x4],ax
00FD106F  |.  8D45 F8       lea eax,[local.2]
00FD1072  |>  8A11          /mov dl,byte ptr ds:[ecx]
00FD1074  |.  3A10          |cmp dl,byte ptr ds:[eax]
00FD1076  |.  75 1A         |jnz short 汇编代码.00FD1092
00FD1078  |.  84D2          |test dl,dl
00FD107A  |.  74 12         |je short 汇编代码.00FD108E
00FD107C  |.  8A51 01       |mov dl,byte ptr ds:[ecx+0x1]
00FD107F  |.  3A50 01       |cmp dl,byte ptr ds:[eax+0x1]
00FD1082  |.  75 0E         |jnz short 汇编代码.00FD1092
00FD1084  |.  83C1 02       |add ecx,0x2
00FD1087  |.  83C0 02       |add eax,0x2
00FD108A  |.  84D2          |test dl,dl
00FD108C  |.^ 75 E4         \jnz short 汇编代码.00FD1072
00FD108E  |>  33C0          xor eax,eax
00FD1090  |.  EB 05         jmp short 汇编代码.00FD1097
00FD1092  |>  1BC0          sbb eax,eax
00FD1094  |.  83C8 01       or eax,0x1
00FD1097  |>  50            push eax
00FD1098  |.  68 1021FD00   push 汇编代码.00FD2110                       ;  hhh%d\n
00FD109D  |.  E8 6EFFFFFF   call 汇编代码.printfTStartupr_initialize_mta>
00FD10A2  |.  68 1821FD00   push 汇编代码.00FD2118                       ; /pause
00FD10A7  |.  FF15 7820FD00 call dword ptr ds:[<&api-ms-win-crt-runt>; \system
00FD10AD  |.  83C4 0C       add esp,0xC
00FD10B0  |.  33C0          xor eax,eax
00FD10B2  |.  8BE5          mov esp,ebp
00FD10B4  |.  5D            pop ebp                                  ;  kernel32.762D00C9
00FD10B5  \.  C3            retn

大家直接对照源码,理解一下反汇编代码,感受一下自己探索的乐趣吧!

今天的内容就先到这里了,后面可能还会添加cstring库里的字符串处理函数噢!

喜欢的话记得多多点赞+收藏哦~💗💗💗🤞🤞

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

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

相关文章

manacher——马拉车算法(图文详解)

文章目录 简要介绍实际应用算法详解 简要介绍 马拉车算法&#xff0c;Manacher‘s Algorithm 是用来查找一个字符串的最长回文子串的线性方法&#xff0c;是一个叫Manacher的人在1975年发明的&#xff0c;这个方法的最大贡献是在于将时间复杂度提升到了线性O(N)。 实际应用 刷…

ChatGPT让沟通更智能、更便捷

ChatGpt是最近引起强烈关注的一种技术&#xff0c;它可以实现聊天机器人&#xff0c;为使用者解决复杂的信息获取和学习任务。但他也不仅仅是一个聊天机器人&#xff0c;它是一种基于深度学习算法的自然语言生成模型&#xff0c;由OpenAI公司开发。它可以模拟人类的对话方式&am…

AICG - Stable Diffusion 学习思考踩坑实录(待续补充)

关于模型 如果模型中没有各种角度的脚和手&#xff0c;无论你再怎么费劲心思&#xff0c;AI 都画不出来&#xff0c;目前C 站也没有什么好脚的例子&#xff0c;正面脚背面脚&#xff0c;但是没有侧面脚&#xff0c;脚这块还是很欠缺&#xff0c;希望未来有大牛能训练出来美脚 …

Python头歌合集(题集附解)

目录 一、Python初识-基本语法 第1关&#xff1a;Hello Python! 第2关&#xff1a;我想看世界 第3关&#xff1a;学好Python 第4关&#xff1a;根据圆的半径计算周长和面积 第5关&#xff1a;货币转换 二、turtle简单绘图 第1关&#xff1a;英寸与厘米转换 第2关&#xff1…

【MySQL数据库 | 第十篇】DCL操作

目录 &#x1f914; 前言&#xff1a; &#x1f914;DCL介绍&#xff1a; &#x1f914;1.DCL管理用户&#xff1a; 1.查询用户&#xff1a; 图示&#xff1a; 2.创建用户 示例1&#xff1a; 运行结果&#xff1a;​ 示例2&#xff1a; 运行结果&#xff1a;​ 3.修改…

基于html+css的图展示116

准备项目 项目开发工具 Visual Studio Code 1.44.2 版本: 1.44.2 提交: ff915844119ce9485abfe8aa9076ec76b5300ddd 日期: 2020-04-16T16:36:23.138Z Electron: 7.1.11 Chrome: 78.0.3904.130 Node.js: 12.8.1 V8: 7.8.279.23-electron.0 OS: Windows_NT x64 10.0.19044 项目…

色环电阻出现的年代以及如何快速记忆计算

上次群里面大家兴趣盎然地讨论着几颗开关电源上面的色环电阻的读数。因为开关电源上面比较特殊&#xff0c;会出现几颗阻值很小的电阻&#xff08;小于1欧姆的&#xff09;。大家又非常感兴趣地重温了色环的计算方法。 色环的口诀我总结的是&#xff1a;黑&#xff0c;棕红橙&…

插件化技术

插件化技术 一.概述二.原理三.好处四.插件化涉及到的技术以及常用的插件化框架五.详细说明1.第一个问题&#xff1a;类加载&#xff08;1&#xff09;Android 项目中&#xff0c;动态加载技术按照加载的可执行文件的不同大致可以分为两种&#xff1a;&#xff08;2&#xff09;…

本地安装 Stable Diffusion 教程 Mac 版本

前面两篇讲了如何用免费的网络资源搭建 Stable Diffusion&#xff0c;有朋友问&#xff0c;有没有在本地搭建的教程。 以 MacBook Pro 为例&#xff0c;下面是安装步骤。 前置要求&#xff1a;Homebrew&#xff0c;Python 3.0。 如未安装Homebrew&#xff0c;请按照https://bre…

CASAIM与北京大学达成科研合作,基于3D打印技术加快力学性能试验分析,实现高效的力学结构设计和力学测试

近期&#xff0c;CASAIM与北京大学达成科研合作&#xff0c;基于3D打印技术进行力学性能试验分析&#xff0c;快速制造各种力学测试样件&#xff0c;从而实现高效的力学结构设计和力学测试。 北京大学是我国教育部直属的全国重点大学&#xff0c;位列国家“双一流”A类 、“985…

SpringBoot的宠物医院管理系统(有文档)

SpringBoot的宠物医院管理系统 本项目适合用来学习&#xff0c;以及二次开发&#xff0c;分享下 简介 1.访问地址 http://localhost:8080/ 超级管理员账户 账户名&#xff1a;admin 密码&#xff1a;admin123 宠物医生 账户名&#xff1a; laozhang 密码&#xff1a;12345…

异常检测学习笔记 二、基于角度和深度的极值分析技术

一、异常检测的概率模型 为您的数据选择合适的模型,选择一个概率阈值,低于该阈值将数据标记为异常,计算观察数据中每个实例的概率,低于阈值的情况属于异常情况。 研究表明,世界杯比赛的进球数可以很好地近似于泊松分布。在一场比赛中进n球的概率由下式给出: ,其中λ是每…

IP地址与MAC地址

引言&#xff08;有基础的同学可以不看&#xff09;&#xff1a;在复杂的网络通信中&#xff0c;有茫茫多的数据在中传输&#xff0c;它们是如何在相隔一步一步寻找到对方的呢&#xff1f; 网络通信的基本结构https://blog.csdn.net/qq_68140277/article/details/130937717?sp…

OpenStack部署(五)

OpenStack部署 11. 启动一个实例11.1 获取凭证11.2 创建虚拟网络11.3 创建主机规格11.4 生产环境的规格推荐11.5 生成一个键值对11.6 增加安全组规则11.7 创建块设备存储11.8 创建实例 12. 资源整理12.1 用到的端口12.2 openstack各组件常用命令1. openstack命令2. nova的常用命…

chatgpt赋能python:Python怎么5个一行?——提高代码可读性的方法

Python怎么5个一行&#xff1f;——提高代码可读性的方法 在Python编程中&#xff0c;提高代码可读性是非常重要的。然而&#xff0c;如果代码缩进不当&#xff0c;代码块就会非常难以辨认。那么&#xff0c;如何在不影响代码可读性的情况下使代码更清晰易懂呢&#xff1f;本文…

javaScript蓝桥杯---一起会议吧

目录 一、介绍二、准备三、目标四、代码五、完成 一、介绍 网络会议已经成为当下最流行的会议模式&#xff0c;为网络会议提供支持的当然是一些优秀的会议软件。 本题需要在已提供的基础项目中使用 Vue 2.x 知识完善代码&#xff0c;最终实现网络会议软件中&#xff0c;参会人…

javaScript蓝桥杯----权限管理

目录 一、介绍二、准备三、目标四、代码五、知识点六、完成 一、介绍 你有没有想过&#xff0c;在我们日常浏览的网页中&#xff0c;那些新闻或者商品内容是如何被输入到数据库中的呢&#xff1f;大家虽然没有用过&#xff0c;但是肯定听过“后台管理系统”&#xff0c;运营人…

从零开始的软路由之爱快虚拟机搭建openwrt

缘起 上篇文章我们介绍了爱快软路由的搭建方法&#xff0c;成功了实现了软路由的初级布置——能上网了。接下来就是搭建双软路由中的另一个openwrt了&#xff0c;上期介绍了爱快的特点&#xff0c;主要是用来多拨&#xff0c;分流&#xff0c;流控等操作&#xff0c;在这些方面…

maven 插件 assembly 打tar.gz包

maven 插件 assembly 打tar.gz包 一、项目目录二、pom文件1. profiles2. plugins3. resource 三、assembly.xml四、application.yml五、启动脚本1. start.sh2. stop.sh 六、执行 mvn 打包命令七、tar.gz 包上传服务器并解压八、执行 start.sh 启动脚本九、访问 swagger GitHub:…

Tomcat的部署及优化(贼详细)

目录 一、Tomcat服务器简介 1、Tomcat服务器 2、Tomcat三大核心组件 3、 Java Servlet 4、JSP全称Java Server Pages 5、 Tomcat 功能组件结构 6、 Container 结构分析 7、Tomcat 请求过程 二&#xff1a;Tomcat部署与安装 1.关闭防火墙&#xff0c;上传所需软件包 2.安…