【问题标题】:Switch statement assembly code to cswitch 语句汇编代码到 c
【发布时间】:2015-10-28 01:39:44
【问题描述】:

我很难将 switch 语句从汇编代码逆向工程为 C 程序。

.file 
"switch_prob2-soln.c"
.text
.globl switch_prob
.type switch_prob, @function
switch_prob:
.LFB0:
.cfi_startproc
subq $60, %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,8), %rax
 ret
 .L4:
 movq %rdi, %rax
 sarq $3, %rax
 ret
 .L5:
 movq %rdi, %rax
 salq $4, %rax
 subq %rdi, %rax
 movq %rax, %rdi
 .L6:
 imulq %rdi, %rdi
 .L2:
 leaq 75(%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) {

 }
 return result;
 }

我所要求的只是入门的有用建议。我知道我可以使用 -S 或 -O1 进行编译。感谢您的宝贵时间。

这是我的 c 代码在汇编中显示的内容

这是我的 c 代码

如果有人可以帮助我,那就太棒了,我正在尝试让四边形显示 3 2 3 4 5 6

【问题讨论】:

    标签: c assembly switch-statement reverse-engineering


    【解决方案1】:

    目前还不清楚您遇到了什么问题。我希望你知道它使用跳转表。

    很明显,您有 6 个案例和一个默认值,以及一些共享代码。说明很简单,我相信你对这些没有问题。

    至于 switch 表达式本身,它只是由一条指令完成的微不足道的转换。

    我尽量不放弃解决方案,毕竟你征求了建议才能开始。您还需要更多提示吗?

    【讨论】:

    • 所以在 switch(n) 之后,你会输入
    • n=n-60;然后是一行:case:5
    • 对不起,我对跳转表和 switch 表达式有点陌生
    • switch 表达式本身是n-60,所以是switch(n-60)。接下来,比较限制为案例 0 到 5,否则跳转到默认值。当然,您也可以将其写为 switch(n),案例为 60 到 65。
    • 对不起,我尝试输入 switch(n-60) 但它不允许我编译。也非常感谢您的帮助
    猜你喜欢
    • 2016-01-17
    • 2013-01-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-10-01
    • 1970-01-01
    相关资源
    最近更新 更多