c - 从 x86 汇编语言对 C 语言的 switch 语句进行逆向工程

标签 c x86 reverse-engineering

我必须从汇编语言中对 C 语言的 switch 语句进行逆向工程。当我使用 -S 标志进行编译以将汇编代码从我编写的 C 中获取时,这是不正确的。关于我做错了什么有什么见解吗?

提前致谢!

这是组件

.file "switch_prob-soln.c"
.text
.globl switch_prob
.type switch_prob, @function
switch_prob:
.LFB0:
.cfi_startproc
subq $50, %rsi
cmpq $5, %rsi
ja .L2
jmp *.L7(,%rsi,8)
.section .rodata
.align 8
.align 4
.L7:
.quad .L3
.quad .L2
.quad .L3
.quad .L4
.quad .L5
.quad .L6
.text
.L3:
leaq 0(,%rdi,4), %rax 
ret
.L4:
movq %rdi, %rax
sarq $2, %rax
ret
.L5:
leaq (%rdi,%rdi,2), %rdi
.L6:
imulq %rdi, %rdi
.L2:
leaq 10(%rdi), %rax
ret
.cfi_endproc
.LFE0:
.size switch_prob, .-switch_prob
.ident "GCC: (Ubuntu/Linaro 4.6.3-1ubuntu5) 4.6.3"
.section .note.GNU-stack,"",@progbits

这是我写的C

  long switch_prob(long x, long n){
    long result = x; 
    switch(n){

      case 50:  
      case 51:
      result + 4; 
      break; 

      case 52:
      result >> 2; 
      break; 

      case 53:
      result + result + 2; 

      merge: 
      result * result
      break;

      default:
      result * 10;
      break;
   }
    return result;
  }

最佳答案

按照汇编代码的逻辑,我猜测是这样的:

int switch_prob(int x, int n) {
    int result = x; 

    switch (n - 50) {

        case 0:  
        case 2:
            result += 4; 
            break; 

        case 3:
            result >>= 2; 
            break; 

        case 4:
            result += 2; 

        case 5: 
            result *= result;
            break;

        default:
            result += 10;
    }

    return result;
}

测试解决方案的一种方法是编写一个驱动程序,例如:

测试.c

#include <stdio.h>

int switch_prob(int x, int n);


int main() {

    printf("%d\n", switch_prob(1, 54));

    return 0;
}

然后编译汇编代码(如果它与您的系统和驱动程序兼容):

gcc -Wall test.c switch_prob-soln.s

然后编辑您的 test.c 文件,将参数更改为 switch_prob() 以查看您的假设是否成立。我猜跳转表告诉了我们一些关于这些情况的信息:

.quad .L3 # case 0: addition (LEA)
.quad .L2 # default: (no case 1:) addition (LEA)
.quad .L3 # case 2: is case 0: again
.quad .L4 # case 3: right shift (SAR)
.quad .L5 # case 4: addition (LEA)
.quad .L6 # case 5: multiplication (IMUL)

关于c - 从 x86 汇编语言对 C 语言的 switch 语句进行逆向工程,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40542169/

相关文章:

c - 如何在C中读取二进制文件并保存到数组?

objective-c - C 和 Objective-C - 释放无符号字符指针的正确方法

c - JMP 不工作

html - 是否有工具可以将任何网站转换成其框架正在使用的模板?

c - 如何在 linux 中将 c 文件构建到共享对象(库)中

c - strncpy 的问题以及如何修复它

java - 无法在 32 位 JVM 上加载 64 位 SWT 库(即使我下载了 32 位 SWT)

assembly - 如何为 mov eax,moffs32 生成 a1 操作码

java - Hibernate 逆向工程未生成正确的域代码 STS

eclipse - @SequenceGenerator - AllocationSize,使用 Eclipse Hibernate Tools 进行逆向工程