代码优化与LLVM IR pass

简介

  • LLVM IR(Intermediate Representation) 是LLVM的一种中间表示,也可以将它视为中间代码。

    中间代码 的生成是为了便于更好的 代码优化

  • LLVM Pass 是LLVM代码优化(optimization)中的一个重要组成部分。为便于理解,我们可以将Pass看作一个又一个的模块,各个Pass可以通过IR获取信息为下一个Pass做好准备,又或者直接对中间代码进行优化。

    代码优化的实质:分析(Analysis)+转换(Transformation)

  • CSCD70是多伦多大学涉及代码优化的一门课程,配套 github上的课件与作业

注:本文所设计到的代码优化类型并不全面,仅记录下笔者所学的类型。

阅读更多...

字符串类型混淆漏洞的研究

1. 简介

  • 现在几乎已经很少会看到关于恶意字符串所造成的漏洞了,更不用说那些可利用的字符串了
  • 这并不奇怪,因为SDL(安全开发生命周期)已经禁止了所有不安全的函数
  • 但是,如果开发人员错误地使用了增强的安全功能,仍然可能造成严重的安全漏洞。
  • 在adobe acrobat Reader DC中,开发人员已经实现了一些增强的安全字符串处理函数。但开发人员有可能会错误使用这些函数。
  • 在一般情况下,这不是什么大问题。然而,在这个特定的软件中处理字符串时,类型混淆的情况也很容易被触发。
  • 在某些场景中,可以利用这两个条件来实现代码执行。
阅读更多...

ACTF五校联赛

1. Pwn

1. secret_of_girlfriend

分析

  • 程序中有三处地方内藏flag,两处在data段,一处在bss。其中有两处会被销毁,只剩下一处flag还存在。
  • 程序内部有缓冲区溢出,开启Canary保护
  • 通过缓冲区溢出,覆盖栈上environ处指向程序名称的指针为flag地址,并通过___stack_chk_fail将剩下一处flag打印出来就好

实际上如果三处flag都被覆盖,仍然有办法可以得到flag。

阅读更多...

2020网鼎杯部分Pwn题解

此处将会收录笔者力所能及的题解。
超出笔者技术水平的题目(例如kernel exploit)以及笔者因各种因素无法接触的题(例如bind pwn)将不会被收录。

1.青龙组

1. boom1

点击这里下载文件

1) 易知信息

  • 保护全开
  • ELF文件中rodata段上有大量字符串。将其中部分字符串百度一下(例如: duplicate global definition)便可得知,该程序为C语言解释器
  • 在程序main函数中,发现一串疑似可用的关键字/函数名。
    img
阅读更多...

heap - 14 - house漏洞

1. House Of Force

1) 介绍

以下部分介绍来自CTF wiki

  • House Of Force 产生的原因在于 glibc 对 top chunk 的处理。进行堆分配时,如果所有空闲的块都无法满足需求,那么就会从 top chunk 中分割出相应的大小作为堆块的空间。
  • 当使用 top chunk 分配堆块的 size 值是由用户控制的任意值时,我们就可以使得 top chunk指向我们期望的任何位置,这就相当于一次任意地址写。
  • 然而在 glibc 中,会对用户请求的大小和 top chunk 现有的 size 进行验证。
    • top chunk的大小必须足够大,否则申请一块超大内存时,程序会调用mmap而不是切割top chunk。
      这使得我们必须通过堆溢出,将top chunk的size改大。通常将其size改为-1
      因为有符号整数-1,刚好是最大的无符号整数。
    • malloc的大小必须小于-2*MINSIZE(在64位机器上为-0x40

      为什么? 请在heap相关宏定义中,查阅checked_request2size(req, sz)宏定义。

阅读更多...

BUUOJ 部分pwn题解

此处会收录笔者做题中遇到的一些有趣的题

被用于其他博客例题的题目将不会在此重复收录

1. inndy_rop

分析

  • 一个静态编译的简单栈溢出
  • 方法很多,可以用ROPgadget构建ROPchain,从而getshell。但该方法较为复杂
  • 也可以先调用mprotect,将data段的权限变为RWX,写入shellcode并执行。该方法较为简单
  • 可以使用pwntools里自带的ROP模块,事半功倍

mprotect函数,妙用多多

阅读更多...

SROP

1. 介绍

前面虽然做过一道关于SROP的题,但并没有具体总结。这次就来总结一下

  • SROP的原理? (下文摘自CTF wiki)

    • 内核向某个进程发送signal机制,该进程会被暂时挂起,进入内核态。
    • 内核会为该进程保存相应的上下文,主要是将所有寄存器压入栈中,以及压入signal信息,以及指向sigreturn的系统调用地址。我们称ucontext以及siginfo这一段为Signal Frame。需要注意的是,这一部分是在用户进程的地址空间的。之后会跳转到注册过的signal handler中处理相应的signal。因此,当signal handler执行完之后,就会执行sigreturn代码。
    • signal handler返回后,内核为执行sigreturn系统调用,为该进程恢复之前保存的上下文,其中包括将所有压入的寄存器,重新pop回对应的寄存器,最后恢复进程的执行。其中,32位的sigreturn的调用号为77,64位的系统调用号为15。
  • Signal Frame的构建是比较复杂的,因为不同架构下的结构是不一样的。不过值得一提的是,在目前的pwntools中已经集成了对于SROP的攻击。所以我们可以很方便的构建出Signal Frame。

注: 在本文中,Signal Frame和SigreturnFrame是同一个意思

阅读更多...
  • Copyrights © 2020-2023 Kiprey
  • 访问人数: | 浏览次数:

请我喝杯咖啡吧~