介绍
compiler explorer 是一个交互式编译探索网站。用C、c++、c#、f#、Rust、Go、D、Haskell、Swift、Pascal、ispc、Python、Java或其他30多种支持的语言组件编辑代码,并查看代码在实时编译后的样子。
声明:文中所涉及的技术、思路和工具仅供以安全为目的的学习交流使用,任何人不得将其用于非法用途给予盈利等目的,否则后果自行承担!
截止目前,star 16.4k
优点
有在线版,国内可这直接访问 https://godbolt.org/
有github开源地址,可在本地搭建 https://github.com/compiler-explorer/compiler-explorer
可以从底层观察各个函数是如何构成的,程序是如何运行的。
C、C++、Java、Python都是高级语言,它们为了方便我们人理解,语法进行了很多人性化的操作,方便上手和理解。但随着时间推移,用的多了,项目复杂后,我们可能会变得疑惑,这么写和那么些有什么区别,为什么这么写有问题。
有些东西在高级语言上看不同的东西,其实在CPU看来是没有区别的。
比如 int i 和 int* p,在汇编代码层次,他们并没有区别,都是给一个栈地址赋值。
对于想要入门逆向的人来说,用 compiler explorer 来了解高级语言和汇编之间的对应关系,为后续逆向汇编,从汇编反编译成高级语言也很有帮助。
案例:下面都是支持的语言
https://github.com/compiler-explorer/compiler-explorer/tree/main/examples
推荐一本书:《CPU眼里的C/C++》,微信读书上也有
作者根据 compiler explorer 工具,分析了C/C++当中遇到的常见指令,比如指针变量和一般变量的区别,goto和if、for、while的区别。从底层的视角看,往往能解答很多我们在高级语言中看到的代码的疑惑。
让我印象最深刻的时候,是看 goto 和 for 的区别,这在C语言中是两个不同的指令,但在汇编层次,我们用 goto 构造指定的代码,然后到了CPU验证,汇编指令是没有任何区别的。
还有就是 i++ 和 ++i 的区别。如果是在大学学过C语言,参加过考试的,一定会见过对这两种区别的考核,问最后的结果是多少。从C语言上看,可能不明所以,但到了汇编,具体过程就一目了然。
原文始发于微信公众号(进击的HACK):compiler explorer 轻松从汇编角度理解代码
- 左青龙
- 微信扫一扫
-
- 右白虎
- 微信扫一扫
-
评论