LLVM初探 | 申博官网
登录
  • 欢迎进入申博官网!
  • 如果您觉得申博官网对你有帮助,那么赶紧使用Ctrl+D 收藏申博官网并分享出去吧
  • 这里是申博官方网!
  • 申博官网是菲律宾sunbet官网品牌平台!
  • 申博开户专业品牌平台!

LLVM初探

申博_安全防护 申博 138次浏览 已收录 0个评论

申博网络安全巴士站

申博-网络安全巴士站是一个专注于网络安全、系统安全、互联网安全、信息安全,全新视界的互联网安全新媒体。

————————————-

0x01 LLVM简介

The LLVM Project is a collection of modular and reusable compiler and toolchain technologies.

LLVM是模块化、可重用的编译器和东西链的鸠合,有些人把LLVM当做是一个低层的假造机(low level virtual machine),但官方给出的诠释是如许的:

The name “LLVM” itself is not an acronym; it is the full name of the project.

也就是说LLVM并非一个缩写,而是全部项目的全名。
LLVM和传统的编译器(GCC)是有差异的

传统的编译器架构

LLVM初探

传统的编译器架构重要分为三个局部

  • Frontend:前端
    包罗词法剖析、语法剖析、语义剖析、中心代码天生
  • Optimizer:优化器
    重若是对编译前端对天生的中心代码的优化
  • Backend:后端
    翻译中心代码为native机器码

LLVM编译器架构

LLVM初探

LLVM编译器套件与传统编译器架构的分歧之处重要在于

  • LLVM编译器的前端别的层(优化器、后端)是星散的,LLVM特地有一个Clang子项目用来对源码举行编译,天生IR(intermediate representation)中心字节码;而传统编译器的代表(GCC)由于编译前后端耦合度太高,增添一个前端言语支撑或许一个后端平台支撑将会变得异常庞杂。相比之下LLVM由于是星散式架构,其组件复用性就很高,增添言语/平台支撑也相对轻易,增添一个新的编程言语,就增添一个新的前端组件,增添一个新的平台支撑,就增添一个新的后端组件。
  • LLVM编译器分歧的前端一致运用雷同的中心码,不像GCC有种种作风(intel&ATT)
  • LLVM经常被用于一些诠释型言语的动态编译(优化)。相似的JAVA假造机(JVM)的JIT(彷佛如今就有厂在做基于LLVM的JAVA JIT编译器,卖力将高层字节码(java-bytecode)剖析成相对底层的IR中心码,今后编译成响应平台的机器码实行。
  • LLVM也经常被用于一些言语的静态编译,相似的Objective-c就是运用Clang举行编译(之前实在也是运用GCC的,但如今连Xcode的内置编译器都换成Clang了),听说编译时刻是GCC的1/3,语法树占用内存是GCC的1/5,并且诊断信息可读性强,不像GCC是一大坨不轻易辨认的那种。

0x02 狭义的LLVM和广义的LLVM

LLVM初探

广义的LLVM通常指LLVM编译器的团体架构,而狭义的LLVM通常指不包罗前端,只完成中心代码优化和native码天生的局部。IR中心码须要多个pass举行一系列优化后再举行翻译。

0x03 字节码笼统条理

对照典范的就是java bytecode与LLVM IR之间的笼统条理对照,java bytecode与LLVM IR都是用于形貌代码运算的模子,但二者的笼统条理是分歧的。之前想过一个题目,就是为何编译器/假造机须要引入中心码/字节码,如今也许能够明白,源码经由历程编译前端语法剖析后天生笼统语法树(AST),题目涌现了,只是笼统语法树的话,编译器其实不明白编码者的代码意图,也就欠好直接经由历程语法树翻译可实行代码,以是才引入了一个假造层,对语法树举行归结,用一种更低层级的代码(字节码)来透露表现,如许编译器后端就可以更轻松的去剖析代码,终究天生可实行代码。为何说java的bytecode层级要高一点呢,由于java的字节码的语义和java言语的语法结构有异常直接的对应干系,包罗大批的(类java的)面向对象言语的高层操纵,比方虚函数,接口要领挪用。说直白点,光看java字节码你就可以看出这是java写的;而LLVM的IR相对来讲更底层,没有袒露细致平台/言语的相干特性,以是能够明白成一种中层IR,层级比java的bytecode是要低的。

0x04 OLLVM

LLVM前端是Clang,当对源代码举行编译天生IR中心码今后,优化器会对IR举行优化,然后后端天生实行代码。试想一下若是IR举行优化的历程可控,那末LLVM编译后端天生的代码也会是可控的,基于这个道理,OLLVM应运而生,做法就是基于LLVM开辟一些pass来对IR举行优化(修正),然后掌握天生的机器码。OLLVM自身只支撑源码&中心码加固,它的珍爱是基于代码级别的;若是想要做基于二进制的OLLVM加固,须要起首经由历程反汇编引擎(相似的有capstone)把二进制顺序指令抽出,并转为本身的假造指令,VMP代码假造化珍爱就是做的相似的事情,这类珍爱模式须要对指令举行抽取剖析转换再植入,难度较大,关于代码殽杂来讲,基于LLVM对IR举行处置惩罚就好了。
下面是一些用于殽杂的成熟开源项目,盘算今厥后一波源码剖析。

OLLVM
Hikari
Armariris(孤挺花)

1、编译

OLLVM项目中集成了LLVM,以是不须要零丁装置LLVM情况,这边参照官网的申明举行编译装置。一开始用的是最新版的LLVM(version–4),发明编译报错,武断换了一个低一点的版本,发明编译能够继承了。
LLVM初探

这边有个坑,编译的时刻说xxx已存在,看dalao博客找到的编译选项,能够一般编译

cmake -DCMAKE_BUILD_TYPE=Release -DLLVM_INCLUDE_TESTS=OFF ../obfuscator/

然后就是迟缓的编译历程。。。。。。

LLVM初探

orz………焦灼
编译到百分之三十多的时刻,倏忽进度条就卡住了,然后编译历程瓦解,查了一下彷佛是内存分派的太少了,致使历程卡死,因而给假造机加了两个G,继承编译,发明报错:

libpng历史漏洞分析

源码下载 http://78.108.103.11/MIRROR/ftp/png/src/history/libpng12/ 测试样本 https://gitee.com/hac425/data/tree/master/libpng CVE-2004-0597 分析 漏洞代码 void /* PRIVATE */
png_handle_tRNS(png_structp png_ptr, png_infop info_ptr, png_uint_32 length)
{
png_byte readbuf[PNG_MAX_PALETTE_LENGTH]; // 0x100
……………………..
……………………..
png_crc_read(png_ptr, readbuf, (png_size_t)length);
png_ptr->num_trans = (png_uint_16)length; readbuf 是一个 0x100字节的缓冲区

g++: internal compiler error: Killed (program cc1plus)

查了下材料发明照样内存不足。。。。(我都给了四个G了) 解决要领是加一个暂时的交流分区

sudo dd if=/dev/zero of=/swapfile bs=64M count=16  
sudo mkswap /swapfile  
sudo swapon /swapfile  
After compiling, you may wish toCode:  
sudo swapoff /swapfile  
sudo rm /swapfile

末了不轻易终究编译胜利了,build/bin目次下天生了编译前端

LLVM初探

2、殽杂参数

OLLVM有一些殽杂参数,相似的有字符串加密、掌握流扁平化、指令替代、掌握流捏造等等

1、掌握流扁平化

clang -mllvm -fla test.c -o test1

2、指令替代

clang -mllvm -sub test.c -o test2

3、掌握流捏造

clang -mllvm -bcf test.c -o test3

对照一下殽杂编译今后的可实行文件巨细

LLVM初探

在文件对照小的情况下彷佛差异其实不显着2333333,OLLVM牛逼(诙谐)。

3、殽杂结果

先贴一下test.c的源码
LLVM初探

在ida内里看一下殽杂今后的结果

LLVM初探

右侧是开启掌握流扁平化今后的顺序的ida视图,左侧是未增加编译珍爱的顺序的掌握流图

LLVM初探

能够看到顺序逻辑最少庞杂了一个量级,并且一些常量被替代了,致使剖析起来也以为难以明白。OLLVM牛逼!!!

0x05 总结

这篇文章只是记录了一下进修LLVM&OLLVM的历程,实在说实话并没有举行对照细致的剖析,另有一些拓展面也没有想好怎样写,等下次再填坑吧。


申博|网络安全巴士站声明:该文看法仅代表作者自己,与本平台无关。版权所有丨如未注明 , 均为原创丨本网站采用BY-NC-SA协议进行授权
转载请注明LLVM初探
喜欢 (0)
[]
分享 (0)
发表我的评论
取消评论
表情 贴图 加粗 删除线 居中 斜体 签到

Hi,您需要填写昵称和邮箱!

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址