CSAPP - 反编译 string_length

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

虽然先前已经把 phase_1 和 phase_2 做出来了, 但其实是参考了网络上的答案, 仅仅是大概知道了关键汇编代码。但其实并没有真的懂。为啥呢?因为很多模棱两可的地方是靠猜测的,而猜测是脆弱的。

重新看 phase_1, 第一个门槛是 string_length 函数。尝试逐句翻译回 C 代码。

前提条件: 知道 eax 存储返回值, 知道 rdi 存储函数第一个参数。使用Intel风格的汇编。

(gdb) disassemble string_length
Dump of assembler code for function string_length:
   0x000000000040131b <+0>:     cmp    BYTE PTR [rdi],0x0
   0x000000000040131e <+3>:     je     0x401332 <string_length+23>
   0x0000000000401320 <+5>:     mov    rdx,rdi
   0x0000000000401323 <+8>:     add    rdx,0x1
   0x0000000000401327 <+12>:    mov    eax,edx
   0x0000000000401329 <+14>:    sub    eax,edi
   0x000000000040132b <+16>:    cmp    BYTE PTR [rdx],0x0
   0x000000000040132e <+19>:    jne    0x401323 <string_length+8>
   0x0000000000401330 <+21>:    repz ret 
   0x0000000000401332 <+23>:    mov    eax,0x0
   0x0000000000401337 <+28>:    ret    
End of assembler dump.

尝试反汇编为 C 代码:
1)返回值类型:看到了对 eax 寄存器的操作。基本上是 int 类型。C代码为:

int string_length()
{
    ...
}

2)cmp BYTE PTR [rdi], 0x0: 这句是 rdi 寄存器里的值表示的内存地址里的值,和0作比较。用C代码表示为:

int string_length(const char* str)
{
    if (*str == '\0')
    {
        return 0;
    }
}
  1. je 0x401332 <string_length+23>: 和上一句连在一起的, return 0.
  2. mov rdx, rdi: 把函数第一个参数,赋值到一个新的变量里头,大概是:
int string_length(const char* str)
{
    if (*str == '\0')
    {
        return 0;
    }
    const char* ptr = str;
}
  1. add rdx, 0x1: 新赋值的变量加1:
int string_length(const char* str)
{
    if (*str == '\0')
    {
        return 0;
    }
    const char* ptr = str;
    ptr += 1;
}
  1. mov eax, edx: 把刚刚加1的变量,放到 eax 寄存器, 也就是和返回值有关系。没法直接写C代码。继续看。
  2. sub eax, edi: 让 eax 寄存器减掉 edi 寄存器。C代码:
int string_length(const char* str)
{
    if (*str == '\0')
    {
        return 0;
    }
    const char* ptr = str;
    ptr += 1;
    int ret = ptr - str;
    return ret;
}
  1. cmp BYTE PTR [rdx], 0x0: 把 rdx 寄存器里的值对应的内存地址处的值, 和0比较。看不出来C代码。继续看汇编.
  2. jne 0x401323 <string_length+8>: 如果刚刚的比较结果不相等,也就是说 [rdx] != 0, 那么跳转到 add rdx, 0x1 这句。代码:
int string_length(const char* str)
{
    if (*str == '\0')
    {
        return 0;
    }
    const char* ptr = str;
    int ret;
hello:
    ptr += 1;
    ret = ptr - str;
    if (*ptr != '\0')
    {
        goto hello;
    }
    return ret;
}
  1. repz ret: 没啥高深的,就是跳转到 ret

经过上面这段梳理,写出来的C代码很混乱。goto 和 if 的组合,基本上是等价于 while 循环:

int string_length(const char* str)
{
    if (*str == '\0')
    {
        return 0;
    }
    const char* ptr = str;
    int ret;

    do {
        ptr += 1;
        ret = ptr - str;
    } while (*ptr != '\0')
    return ret;
}

再进一步, 感觉 ret 的赋值做了重复计算, do while 也不如 while 直接:文章来源地址https://www.toymoban.com/news/detail-791302.html

int string_length(const char* str)
{
    if (*str == '\0')
    {
        return 0;
    }
    const char* ptr;
    for (ptr = str + 1; ptr != '\0'; ptr++);
    return ptr - str;
}

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

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

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

相关文章

  • 【Uni-App】微信小程序编译每次都出现[ project.config.json 文件内容错误] project.config.json: libVersion 字段需为 string

    当前用的开发工具版本不是 稳定版 根据微信小程序文档内容进行配置。 值 说明 latest 最新的非灰度中的基础库 trial 最新的基础库 widelyUsed 使用比例最高的基础库 在 manifest.json中加入 重启项目即可 根据自己需要,关闭 微信开发者工具 的 自动更新最新版本 功能 通过点击菜

    2024年02月21日
    浏览(45)
  • CSAPP--ATTACKLAB实验

    目录 一、实验步骤         二、目标程序 三、实验内容第一部分:代码注入攻击 3.1.        第一关 3.2.        第二关 3.3.        第三关 四.   实验内容第二部分:面向返回的编程 4.1.        第四关 4.2.        第五关 附录A HEX2RAW的使用 附录B 生成字

    2024年02月09日
    浏览(41)
  • CSAPP实验一:DataLab

    Lab1 DataLab 这个实验主要是让大家充分理解C语言中位运算、逻辑运算和算数运算以及计算机中无符号数、有符号数和浮点数是如何表示的。 通过认真阅读完CSAPP第三版中第二章的内容,完成实验难度不是太大,部分题目比较有难度~ /datalab-handout这个目录下我们只用修改 bits.c

    2024年02月07日
    浏览(33)
  • CSAPP:BombLab 详细解析

    Bomb Lab 来自《深入理解计算机系统》(CSAPP)一书的第三章的配套实验,该实验的目的是通过反汇编可执行程序,来反推出程序执行内容,进而能够正确破解”密码“,解除“炸弹”。 本实验共有6个 phase,对于每个 phase,你需要输入一段字符串,然后让代码中 explode_bomb函数

    2023年04月09日
    浏览(45)
  • 程序人生(CSAPP大作业)

    摘  要 本文介绍了 Hello 程序的生命周期。本文通过对Hello在Linux下的预处理、编译、汇编、链接等进程的分析,详细讲解了一个程序从诞生到执行再到消亡的典型过程。虽然程序执行的过程在程序员眼中只是屏幕上显示的一根字符串,但在短短的几毫秒内,程序经历了预处理

    2023年04月24日
    浏览(54)
  • CSAPP实验buflab(bufbomb)

    本实验的目的在于加深对 IA-32 过程调用规则和栈结构的具体理解。实验的主要内容是对一个可执行程序“bufbomb”实施一系列缓冲区溢出攻击(buffer overflow attacks),也就是设法通过造成缓冲区溢出来改变该程序的运行内存映像(例如将专门设计的字节序列插入到栈中特定内存

    2024年02月03日
    浏览(34)
  • CSAPP Shell Lab 实验报告

    前言:强烈建议先看完csapp第八章再做此实验,完整的tsh.c代码贴在文章末尾了 进程的概念、状态以及控制进程的几个函数(fork,waitpid,execve)。 信号的概念,会编写正确安全的信号处理程序。 shell的概念,理解shell程序是如何利用进程管理和信号去执行一个命令行语句。 sh

    2024年02月04日
    浏览(41)
  • csapp实验5-cachelab实验详解

    1 简要分析 实验目的:熟悉cache,学会根据cache优化程序执行速度 工作空间:csim.c和trans.c 实验内容: part A:在csim.c下面编写一个缓存模拟器来模拟cache的行为,并且规定该模拟器用LRU替换策略,即替换某组中最后一次访问时间最久远的一块,还要支持一些输入可选参数 操作

    2024年02月04日
    浏览(34)
  • CSAPP Lab4- PerfLab

    图像用一维数组表示,第(i,j)个像素表示为I[RIDX(i,j,n)],n为图像的维数 目标:使用代码优化技术使旋转操作运行的更快 目标:使用代码优化技术使平滑操作运行的更快 CPE or Cycles per Element 如果一个函数使用C个周期去执行一个大小为N*N的图像,那么CPE=C/(N*N),因此CPE越小越好

    2024年02月06日
    浏览(42)
  • 【CSAPP 3.5】算术和逻辑操作

    下表列出了 x86-64 的一些整数和逻辑操作。大多数操作都分成了指令类,这些指令类有各自带不同大小操作数的变种(除了 leaq )。例如,指令 ADD 由 4 条加法指令组成: addb 、 addw 、 addl 、 addq ,分别是字节加法、字加法、双字加法、四字加法。以下操作被分为 4 组: 加载

    2024年02月03日
    浏览(35)

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

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

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

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

二维码1

领取红包

二维码2

领红包