compiler explorer 轻松从汇编角度理解代码

compiler explorer 轻松从汇编角度理解代码

进击的HACK 2024-11-15 23:55

介绍

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语言上看,可能不明所以,但到了汇编,具体过程就一目了然。

往期推荐

基于flutter的Android vpn代理工具

用友漏洞一键探测利用

Jar Obfuscator – 图形化 JAR/CLASS 字节码混淆工具

降低js逆向分析难度的油猴脚本

简单绕过 IOS应用 frida检测

burp插件 | 自动丢弃不需要的http数据包

轻松入门,frida n种过app特征检测办法之一

小技巧 | Proxifier使用Chain实现多级代理

SpringBoot jasypt 配置文件/属性ENC加密

Databasetools 一款用Go语言编写的数据库自动化提权工具

在混淆的so中寻找sign签名函数