逆向-beginners之循环while

这篇具有很好参考价值的文章主要介绍了逆向-beginners之循环while。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

#include <stdio.h>

int my_strlen(const char * str)
{
    const char *eos = str;

    while (*eos++);

    return (eos - str - 1);
}

int main()
{
    return my_strlen("xiaozhi");
}

#if 0

mov eax, dword ptr _str$[ebp]    ; 将指针指向字符串
mov dword ptr _eos[ebp], eax    ; 指向局部变量eos
mov ecx, dword ptr _eos$[ebp]    ; ECX=eos

movsx edx, byte ptr [ecx]        
mov eax, dword ptr eos$[ebp]    ; eax = eos
add eax, 1                        ; eax++
mov dword ptr _eos$[ebp], eax    ; eax 还原为 eos
test edx, edx                    ; edx == 0 ?


movsx , mov with sign-extend。在把小空间数据转换为大空间数据时,存在填充高位数据的问题。如将原始数据的8位数据填写充EDX的低8位:原始数据是负数,该指令将使用1填充第8到第31位(高24),否则使用0填充高24位。

/* GCC */

not ecx

not对操作数的所有位(bit)都进行非运算。和xor ecx, 0xffffffff等价。 not ecx 的结果与某数相加,相当于某数减去ECX和1。

在程度开始的时候,ECX保存了字符串首个字符的地址(指针),EAX存储的是终止符的地址。对ECX求非,再与EAX相加,就是在计算EAX-ECX-1的值。这种运算可以得到正确的字符串长度。

#endif

#if 0
/*
 * intel
 */
0000000000001129 <my_strlen>:
    1129:    f3 0f 1e fa              endbr64
    112d:    55                       push   %rbp
    112e:    48 89 e5                 mov    %rsp,%rbp
    1131:    48 89 7d e8              mov    %rdi,-0x18(%rbp)
    1135:    48 8b 45 e8              mov    -0x18(%rbp),%rax
    1139:    48 89 45 f8              mov    %rax,-0x8(%rbp)
    113d:    90                       nop
    113e:    48 8b 45 f8              mov    -0x8(%rbp),%rax
    1142:    48 8d 50 01              lea    0x1(%rax),%rdx
    1146:    48 89 55 f8              mov    %rdx,-0x8(%rbp)
    114a:    0f b6 00                 movzbl (%rax),%eax
    114d:    84 c0                    test   %al,%al
    114f:    75 ed                    jne    113e <my_strlen+0x15>
    1151:    48 8b 45 f8              mov    -0x8(%rbp),%rax
    1155:    48 2b 45 e8              sub    -0x18(%rbp),%rax
    1159:    83 e8 01                 sub    $0x1,%eax
    115c:    5d                       pop    %rbp
    115d:    c3                       retq   

000000000000115e <main>:
    115e:    f3 0f 1e fa              endbr64
    1162:    55                       push   %rbp
    1163:    48 89 e5                 mov    %rsp,%rbp
    1166:    48 8d 3d 97 0e 00 00     lea    0xe97(%rip),%rdi        # 2004 <_IO_stdin_used+0x4>
    116d:    e8 b7 ff ff ff           callq  1129 <my_strlen>
    1172:    5d                       pop    %rbp
    1173:    c3                       retq   
    1174:    66 2e 0f 1f 84 00 00     nopw   %cs:0x0(%rax,%rax,1)
    117b:    00 00 00
    117e:    66 90                    xchg   %ax,%ax

/*
 * arm
 */
000000000040051c <my_strlen>:
  40051c:    d10083ff     sub    sp, sp, #0x20
  400520:    f90007e0     str    x0, [sp, #8]
  400524:    f94007e0     ldr    x0, [sp, #8]
  400528:    f9000fe0     str    x0, [sp, #24]
  40052c:    d503201f     nop
  400530:    f9400fe0     ldr    x0, [sp, #24]
  400534:    91000401     add    x1, x0, #0x1
  400538:    f9000fe1     str    x1, [sp, #24]
  40053c:    39400000     ldrb    w0, [x0]
  400540:    7100001f     cmp    w0, #0x0
  400544:    54ffff61     b.ne    400530 <my_strlen+0x14>  // b.any
  400548:    f9400fe1     ldr    x1, [sp, #24]
  40054c:    f94007e0     ldr    x0, [sp, #8]
  400550:    cb000020     sub    x0, x1, x0
  400554:    51000400     sub    w0, w0, #0x1
  400558:    910083ff     add    sp, sp, #0x20
  40055c:    d65f03c0     ret

0000000000400560 <main>:
  400560:    a9bf7bfd     stp    x29, x30, [sp, #-16]!
  400564:    910003fd     mov    x29, sp
  400568:    90000000     adrp    x0, 400000 <_init-0x3b0>
  40056c:    9118c000     add    x0, x0, #0x630
  400570:    97ffffeb     bl    40051c <my_strlen>
  400574:    a8c17bfd     ldp    x29, x30, [sp], #16
  400578:    d65f03c0     ret
  40057c:    00000000     .inst    0x00000000 ; undefined


#endif文章来源地址https://www.toymoban.com/news/detail-732954.html

到了这里,关于逆向-beginners之循环while的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 汇编语言(Assembly Language)习题:键盘输入一个字符串,试将其中的小写字母转换为大写字母,其它字符保持不变。

    前置知识:汇编语言常用系统功能调用(如果懂直接跳过看题目详解) 格式: 功能:从键盘输入字符的ASCII码送入寄存器AL中,并送显示器显示。 格式: 功能:将DL寄存器中的字符送显示器显示,如果DL中为〈CTRL〉+〈BREAK〉的ASCII码,则退出。 格式: 功能:将DL寄存器中的字

    2024年02月03日
    浏览(79)
  • Win10 添加或删除功能时报错:0x80073701,找不到引用的汇编 (ERROR_SXS_ASSEMBLY_MISSING)

    问题描述: 当通过控制面板或DISM命令或PowerShell命令Enable-WindowsOptionalFeature修改Windows功能时,可能会遇到此报错,导致功能修改失败。 关于这个问题的来源,英文版的错误信息很明确:ERROR_SXS_ASSEMBLY_MISSING,有SXS组件找不到,中文机翻痕迹明显,压根看不懂是啥意思。 如果你

    2024年02月05日
    浏览(49)
  • 安天逆向教程——常用汇编语句

          反汇编时更多关注这些条件分支。如果看懂这些条件分支,会对程序的大体逻辑有一个整体的了解。 至于程序里面的细节,有时会省略掉。往往关键的跳转理解了甚至进行一点点的改动,就会使得程序发生翻天覆地的变化。    

    2024年02月16日
    浏览(37)
  • 反汇编逆向实战——扫雷辅助制作

    刚开始是预备知识,如果熟悉的话,可以直接跳到第二部分阅读 在 Windows API 中, SetTimer 函数用于创建一个定时器,并在指定的时间间隔后触发一个定时器消息。以下是关于 SetTimer 函数的介绍: 功能:创建一个定时器,并在指定的时间间隔后触发定时器消息。 参数: hWnd:

    2024年02月08日
    浏览(42)
  • 【Python】循环语句 ② ( while 嵌套循环 | 代码示例 - while 嵌套循环 )

    while 嵌套循环 就是 在 外层循环 中 , 嵌套 内层循环 ; while 嵌套循环 语法格式 : while 嵌套循环 也是基于 空格缩进 , Python 中基于 空格缩进 判定代码逻辑的层次关系 ; 外层循环 的 循环操作 前面有 四个空格缩进 , 内层循环 的 while 和 循环条件 所在的语句 前面有 四个空

    2024年02月06日
    浏览(53)
  • 什么是循环语句?如何使用for循环、while循环和do-while循环?

    1. 引言: 循环语句是一种编程结构,用于重复执行一段代码块,直到满足特定条件为止。它在程序中起到了简化代码、提高效率和处理大量数据的重要作用。在本文中,我们将详细讨论三种常见的循环语句:for循环、while循环和do-while循环。 2. for循环: for循环是一种常用的循

    2024年02月07日
    浏览(61)
  • C语言的while循环、do-while循环、for循环

    1 while循环 一般形式为: 意思是,先计算“表达式”的值,当值为真(非0)时, 执行“语句块”;执行完“语句块”,再次计算表达式的值,如果为真,继续执行“语句块”……这个过程会一直重复,直到表达式的值为假(0),就退出循环,执行 while 后面的代码 2 do-while循

    2024年02月10日
    浏览(53)
  • 滴水逆向3期笔记与作业——01汇编

    防止OneNote丢失。 海哥牛逼。 函数功能: MOV EAX,DWORD PTR SS:[EBP+8] ADD EAX,DWORD PTR SS:[EBP+C] 作业1 主要功能 作业2 主要功能 5+6-5+0xA=0x10 作业3 主要功能 比较5,0C和9的最大值 计算7+6+5+4+3+2+3+2=0x20 海哥牛逼。

    2023年04月25日
    浏览(23)
  • 【JavaScript】JavaScript 程序流程控制 ⑥ ( while 循环概念 | while 循环语法结构 )

    在 JavaScript 中 , while 循环 是一种 \\\" 循环控制语句 \\\" , 使用该语句就可以 重复执行一段代码块 , 直到指定的 \\\" 条件表达式 \\\" 不再满足 , 如果 \\\" 条件表达式 \\\" 一开始就不满足 , 循环体 永远不会执行 ; while 循环语法结构如下 : 首先 , 执行 \\\" 条件表达式 \\\" , 在上述语法结构中 , \\\" 条件

    2024年04月15日
    浏览(41)
  • 【软件逆向-分析工具】反汇编和反编译工具

    目录 一、IDA 1.1、简介: 1.2、使用方法: (1)IDA打开文件 (2)IDA主窗口介绍 (3)IDA的基本使用 二、调试器 2.1、简介: 2.2、Ollydbg (1)主界面 (2)断点操作 (3)代码跟踪操作 2.3、gdb (1)简介: (2)安装 (3)基本的调试操作 三、Trace类工具 3.1、简介: 3.2、Qira 反汇

    2024年02月04日
    浏览(43)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包