栈溢出学习(三)

实验环境

​ Ubuntu12.04

ASLR

​ Address space layout random(地址空间布局随机化),该技术随机了:

  • 栈地址
  • 堆地址
  • 共享库地址

内存地址随机化机制有以下三种情况:

0 - 表示关闭进程地址空间随机化。
1 - 表示将mmap的基址,stack和vdso页面随机化。
2 - 表示在1的基础上增加栈(heap)的随机化。

​ 一旦这些地址被随机化了,我们的return2libc和shellcode便不好使了,因为shellcode需要栈上的地址,return2libc需要知道libc的起始地址。需要注意的是,ASLR随机了libc库的起始地址,但是函数的偏移地址仍然是一个常数。我们将采用三种方法来绕过ALSR:

  • Return-to-plt
  • Brute force
  • GOT overwrite and GOT dereference

Return-to-plt

​ 这个技术中我们不返回到libc函数,而是返回到一个函数的PLT中(该地址不会被随机化,因为这个地址在文件运行之前就已经知道),既然"function@PLT"不被随机化,供给制不用再预测libc基础地质,而是简单的返回到"function@PLT"就可以调用函数了。

PLT(Procedural Linkage Table)

​ 共享库被许多进程所共享,所以一般只有读和执行的权限

Brute force

GOT overwrite and GOT dereference

GOT overwrite

offset_diff = execve_addr - getuid_addr
GOT[getuid] = GOT[getuid] + offset_diff

GOT dereference

offset_diff = execve_addr - getuid_addr
eax = GOT[getuid]
eax = eax + offset_diff

ROP

什么是ROP?

GOT overwrite using ROP

QianLong Sang
QianLong Sang
Second Year CS Phd

My research interests include operating system, computer architecture and computer security.