Learning LLVM Part 2

UnderstandingLLVMPart2 咕咕咕,接上篇《LearningLLVMPrat1》。这篇大概梳理一下这两个月摸鱼时候遇到的坑。一些坑如果要编译成功 LLVM 树,那么熟练的使用各种方式把代码拖下来,再用合适的环境编译必不可少。其实编译这个巨大的东西,还需要好一点的硬件设备(一般我们会都卡在硬盘 IO 上,IO 卡住了就会 Cache 在内存里,然后内存爆炸,PC 就什么也动不了了),比如在目前的这个工

控制流完整性(CFI)发展简述

控制流完整性(CFI)发展简述 0x00 从 shellcode 说起在二进制安全中,大部分的漏洞利用方式是劫持控制流,接着使程序按照攻击者的攻击思路运行下去,使得攻击者获得目标程序的控制权,甚至还可以进行提权来全面控制目标机器。在软件安全保护技术还不是很发达的年代,我们如果想劫持程序的控制流,一般的思路是通过栈溢出控制程序中某个函数的返回地址,然后在该地址上布置 shellcode,将控制流劫持至 shell

Learning LLVM Part-1

(这个还没写完 TAT)LLVM 不仅仅是一个编译器,而是一个有很多特性的编译框架,比如 JIT、支持了很多非类 C 语言,如 Rust 等等,此外,还是一种 AppStore 上的发布方式。LLVM 和其他编译器不同的地方是:LLVM 的中间表示,即 LLVMIR 是一个创新,有了比汇编语言更好的可读性 LLVM 比其他的编译器更加模块化 LLVM 不仅仅可以实现编译优化,还可以做到:架构模拟、动态二进制分析工具、源代码变换(抽象

Data-Oriented Programming

Data-OrientedProgramming:OntheExpressivenessofNon-ControlDataAttacks 引言上一代的攻击方式是通过代码注入来劫持程序控制流 ROP 和 DOP 都是图灵完整的在程序的控制执行中执行一些简短的指令序列,使得模拟图灵机的具体操作成为可能,如赋值、运算等问题非控制数据攻击(Non-controlDataAttacks)在一些环境上(如现代浏览器),仅

详解 LLVM 混淆器

作者:KareemEl-Faramawi|ToshiPiazza 译:SkyeLLVM 混淆器是一个工业级的混淆器,在近几年的 CTF 比赛中频频出现。这篇博文主要包括了我们在理解混淆器本身的设计方面的工作,以及在模糊处理的实现中可能存在的弱点。我们使用 BinaryNinja 及其插件来使这方面的工作自动化。引言开源的 LLVM 混淆器显示为三个 3 个相对独立的 LLVM 分支,都是为了执行掩盖 CFG 的混淆模式,或是以

和 DE1-SOC 一起玩耍

多看看 User-Manual,会有惊喜;) 最终我们使用 RISC 汇编实现了某栅栏加密。代码于 https://github.com/skyel1u/fpga 开源。Introduction 芯片架构如下:最近手里拿到了一块 de1-soc 的 FPGA 开发板,看上去这个板子的性能还不错,FPGA 部分的芯片型号是 AlteraCyclone®VSE5CSEMA5F31C6N,有 64M 的 SDRAM;在 HPS 部分,有 1G

使用 Angr-Part I

Useangr-1 安装 angr 在 Ubuntu 上,首先我们应该安装所有的编译所需要的依赖环境:sudoaptinstallpython-devlibffi-devbuild-essentialvirtualenvwrapper 强烈建议在虚拟环境中安装 angr,因为有几个 angr 的依赖(比如 z3)是从他们的原始库中 fork 而来,如果你已经安装了 z3, 那么你肯定不希望 angr 的依赖覆盖掉官方的共享库。对于