栈溢出学习(三)
实验环境
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?