美文网首页逆向工程入门
八、小白逆向之路之对strcmp函数的反汇编分析

八、小白逆向之路之对strcmp函数的反汇编分析

作者: stone2333 | 来源:发表于2019-09-28 20:02 被阅读0次

本文要点

  • strcmp函数是什么
  • strcmp函数的反汇编分析

一、strcmp函数是什么

strcmp函数是C/C++语言中的一个字符串比较函数。

其格式为: strcmp(str1,str2)//str1/str2均为字符串指针,返回值为0 1 -1。

其原理是:
将两个字符串的字符一个一个字符的比较,若完全一样,则返回0
如果遇到不一样的字符分为一下两种情况:
1.前者大于后者:返回1
2.前者小于后者:返回-1

二、strcmp函数的反汇编分析

1.PNG

上图就是strcmp函数的反汇编代码,下面让我们来一步一步分析吧!

图中 73F52800行 到 73F22848行就是完整的strcmp函数的反汇编代码

第一步是将str1和str2的首地址赋值给edx和ecx(图2)

2.PNG

第二步是检测str1的首地址是否为4的倍数,如果不是就要跳转去另一段代码将字符串的地址比较到4的倍数再返回来(我也暂时没想通为什么要这样做,各位大佬想到了告诉小弟一下)

3.PNG 跳转去的代码(这段代码的逻辑就是对比str1 str2 直到str1的首地址为4的倍数): 4.PNG

第三步是将str1的首四个字节(其实是以edx开始的四个字节)赋值给eax

5.PNG
第四步开始正式的比较了 al存放的是第一个字节,至于为什么这里就是不再赘述了,不懂了回去看看汇编语言
将al与str2的第一个字节相比较(地址ecx所在的字节)
如果不等于就跳转到 73F52844 这里,待会再解释 73F52844 这里的代码是干什么用的,但是我们可以猜想一下一定是决定返回 1 还是返回 -1 的代码
然后会判断一下字符串str1是不是结束了(字符串以 0 结尾) ,如果结束了直接跳转到返回 0 的代码 73F52844 6.PNG

第五步跟第四步类似 比较以edx开始第二个字符

7.PNG

第七步是将eax中高16位的两个字符移动到低16位来,然后继续重复 五 六步 的动作

8.PNG

第八步是给edx 和 ecx 都加 4,如果第四个字符不等于0 ,那就跳转到第三步继续做比较

结果
我们可以看到比较的结果可以在两处返回
1、若str1 执行到结束字符 0 的位置,说明 此时的 str2 也是 等于 0(如果不等的话,前面两者的比较就会跳转),那么程序就会跳转到以下代码,eax作为返回值 置位 0

9.PNG

2、如果是两个字符对比不相等,就会跳转到如下代码:


先来述说 sbb 的用法 ,sbb eax,eax 等价于 eax = eax - eax -cf
CF 是进位/借位标志符

在跳转之前 我们进行了 cmp a,b

  • 如果是 a < b,CF因为借位置 1
    那么:
    sbb eax,eax --> eax = FFFF
    shl eax,1 --> eax =FFFE
    add eax,1 -->eax = FFFF
    也就是说 eax = -1D(十进制补码表示)

  • 如果a>b
    那这一段代码执行下来
    eax = 1(十进制)

相关文章

  • 八、小白逆向之路之对strcmp函数的反汇编分析

    本文要点 strcmp函数是什么 strcmp函数的反汇编分析 一、strcmp函数是什么 strcmp函数是C/...

  • 没时间看的书

    C++反汇编与逆向分析技术揭秘 介绍反汇编软件,内存的相关问题,例子很多有时间搞逆向一定要看这本书

  • reverse简介

    软件代码逆向主要是对软件的结构、流程、算法、代码等进行逆向拆解和分析。 有我objdump反汇编不了的机器码吗?有...

  • 六、小白逆向之路之常见C语句的反汇编

  • iOS开发之逆向工程

    逆向工程:是一个广义概念,是指从可运行的程序系统出发,运用解密、反汇编、系统分析、动态调试等多种技术对软件进行分析...

  • 【CTF】PHP漏洞(学习积累中)

    1. strcmp字符串比较 strcmp() 函数比较两个字符串,且对大小写敏感 语法:strcmp(strin...

  • 逆向工具集和安装和使用

    iOS逆向工程的工具大致可分为四类: 检测工具如:Reveal、tcpdump等 反编译工具(反汇编工具 - 分析...

  • strcmp函数

    一,strcmp 作用字符串比较如果 str1 小于 str2 返回 < 0; 如果 str1 大于 str2 返...

  • strcmp函数

    strcmp(S1,S2):寻找S1和S2是否完全匹配,S1和S2没有顺序的区分。例: s= 'wooden';s...

  • strcmp()函数

    声明 int strcmp(const char *str1,const char *str2) 参数 str1 ...

网友评论

    本文标题:八、小白逆向之路之对strcmp函数的反汇编分析

    本文链接:https://www.haomeiwen.com/subject/tewquctx.html