【发布时间】:2017-03-25 08:11:10
【问题描述】:
我必须从汇编中对 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;
}
【问题讨论】:
-
除了
long result - x;没有任何意义,而且您的计算没有任何副作用,您还可以在函数中定义一个函数,它不是 C。 -
"...不正确。" 怎么样?您还没有解释实际问题是什么。
-
你应该编译你的 C 代码为
gcc -Wall -S -O -fverbose-asm并且你需要改进代码直到你没有收到警告。请注意,result*10;(倒数第 4 行)没有可观察到的副作用,因此很可能会被优化和删除。也许您的意思是return result * 10;,但这只是猜测。
标签: c x86 reverse-engineering