Environ



在linux应用程序运行时,内存的最高端是环境/参数节(environment/arguments section)
用来存储系统环境变量的一份复制文件,进程在运行时可能需要。
例如,运行中的进程,可以通过环境变量来访问路径、shell 名称、主机名等信息。
该节是可写的,因此在格式串(format string)和缓冲区溢出(buffer overflow)攻击中都可以攻击该节。
*environ指针指向栈地址(环境变量位置),有时它也成为攻击的对象,泄露栈地址,篡改栈空间地址,进而劫持控制流。

Continue reading

Unlink



unlink是大名鼎鼎的heap based漏洞,虽然glibc不断对unlink宏的安全性进行加固,但是Unlink依旧能够实现较好的漏洞利用效果,在新版本下使用unsafe-unlink最终能够达到arbitrary 4 bytes mirrored overwrite的效果。

Continue reading

Pwnable.tw start-orw-calc



start

题目的binary很小
没有开启NX,考虑注入shellcode,思路大致如下:

  • 1.泄露栈地址leak stack
  • 2.控制shellcode,由于程序溢出最多60个字节,shellcode尽量控制在30个字节以内,否则会被截断
  • 3.计算offset,跳转到stack上执行shellcode

orw

程序写shellcode地址,之后跳转到shellcode执行,shellcode地址在bss段上,所以程序开启的canary没有意义

由于限制了只能够使用open,read,write等syscall,所以也就是需要自己写shllcode,大致流程如下:

由于flag比较长,至少0x30才能够接收到完整的flag

calc



reverse

题目实现了一个简单的计算器解释器,是通过两个栈来实现的,一个栈保存运算的结果,另一个栈保存所有的运算符。

Continue reading

Unlink



unlink是大名鼎鼎的heap based漏洞,虽然glibc不断对unlink宏的安全性进行加固,但是Unlink依旧能够实现较好的漏洞利用效果,在新版本下使用unsafe-unlink最终能够达到arbitrary 4 bytes mirrored overwrite的效果。

Continue reading

FORTIFY_SOURCE



0. Introduction

2004年9月,RedHat的几位软件工程师提交了一个针对GCC和GLibc的新补丁,其作用是为内存和字符串函数提供一种轻量级的缓冲区溢出保护机制。它可以通过定义\(\_FORTIFY\_SOURCE\)标志来配置,因此常被称为\(FORTIFY\_SOURCE\),在目前主流的linux操作系统中都能够见到他的身影,包括Ubuntu,Feroda,Redhat,Centos等等……并且\(FORTIFY\_SOURCE\)在安卓平台有着更为广泛的应用,这可能与安卓特殊的管理机制有关

在该补丁的官方描述中,我们能够得到作者对这个patch的部分描述:

The intent of this patch is to add some checks that have no or non-measurable runtime overhead, so something that can be enabled for all programs and libraries in an operating system.

The patch certainly doesn’t prevent all buffer overflows, but should prevent many common ones. It works by computing a constant (conservative) number of bytes remaining to the end of object(s) each destination pointer passed to memory and string functions, if possible checking for overflows at compile time, if not possible passing that constant size to special checking alternatives of the memory/stringfunctions.

when the above GCC 4.0+ and -D_FORTIFY_SOURCE=1 is used at optimization level 1 and above, security measures that shouldn’t change behaviour of conforming programs are taken. With -D_FORTIFY_SOURCE=2 some more checking is added, but some conforming programs might fail.

基本总结如下:

  1. FORTIFY_SOURCE是一种对缓冲区溢出以及格式化字符串的轻量级的保护机制 ,但并不是所有类型的缓冲区溢出都可以用这个它来检测
  2. 它保护C和C ++代码
  3. 没有大量的运行时的开销,不会影响到系统的性能
  4. 这种保护机制并不仅仅够应用于glibc,只要将相应的头文件string.h,stdio.h打上补丁,也能够实现这种保护,在gcc中由于它使用了-D_FORTIFY_SOURCE来开启保护,因此得名

Continue reading

NX & ASLR



0. Introduction

谈起ASLR与NX,就不得不提到他们的前身,Pax
在wiki上,对Pax的定义如下:

PaX is a patch for the Linux kernel that implements least privilege protections for memory pages. The least-privilege approach allows computer programs to do only what they have to do in order to be able
to execute properly, and nothing more.

但是由于各种原因,Pax并没有能够完全应用在linux的内核中,致力于内核安全的开发者结合Pax的思想,不断的尝试把PaX的代码分拆成小的patch提交给Linux内核社区,最终也就出现了现在我们所熟知的ASLR/RELRO/NX/CANARY/FORITY/PIE等保护技术

Continue reading