1. ASLR 技术介绍
ASLR 技术是一种针对缓冲区溢出的安全保护技术。
ASLR,全称为 Address Space Layout Randomzation,地址空间布局随机化。ASLR 技术在 2005 年的 kernel 2.6.12 中被引入到 Linux 系统,它将进程的某些内存空间地址进行随机化来增大入侵者预测目的地址的难度,从而降低进程被成功入侵的风险。当前 Linux、Windows 等主流操作系统都已经采用该项技术。
ASLR功能等级:Linux系统中ASLR 技术分三个等级。如下:
-
0:没有随机化。即关闭 ASLR。
-
1:保留的随机化。共享库、栈、mmap() 以及 VDSO 将被随机化。
-
2:完全的随机化。在 1 的基础上,通过 brk() 分配的内存空间也将被随机化。
2. ASLR 功能关闭
ASLR 的等级可以通过一个内核参数 randomize_va_space 来进行控制。
可通过命令查看当前系统的 ASLR 等级,操作如下:
cat /proc/sys/kernel/randomize_va_space
系统默认这个功能是开启的。有时候调试代码时,需要更改 ASLR 功能,可通过命令设置。
如果想关闭该功能,则可以输入如下命令即可关闭,注意需要 root 权限,命令如下:
echo 0 > /proc/sys/kernel/randomize_va_space
确认是否成功关闭,可以通过命令查看,Linux 系统下操作如下:
二. Linux编译选项 -no-pie
1. PIE 技术介绍
PIE (position-independent executable)
是一种生成地址无关可执行程序的技术。如果编译器在生成可执行程序的过程中使用了PIE,那么当可执行程序被加载到内存中时其加载地址存在不可预知性。
2. 关闭 PIE 功能
有时需要调试代码,PIE 功能会影响到调试。需要关闭 PIE 功能。我这里系统是 ubuntu 系统。
编译程序需要加入
-no-pie
选项,对代码进行编译。
-no-pie
选项是
gcc
编译器的编译选项之一。
关闭 PIE 功能时编译代码命令:
gcc -no-pie test.c -o test
经过测试,ubuntu 20.04 默认 gcc 编译程序时是有 PIE 功能的。测试如下:
代码如下:
#include <stdio.h>
int g_data = 0;
void main()
printf("g_data address = %x\n", &g_data);
当默认进行 gcc 编译时,即只输入 gcc main.c -o main.out 命令。可以看出全局变量的地址每次运行不固定。如下所示:
当关闭 PIE 功能编译程序时,即输入 gcc -no-pie main.c -o main.out 命令进行编译。则每次运行程序时,全局变量的地址固定不变,如下所示:
当代码中存在内存泄露,使用 mtrace 工具对代码进行排查时,经过测试验证:当在编译代码时加入 -no-pie 选项进行编译后, mtrace 工具才会定位到具体的某一行 C 代码行。
上篇文件写完后,很多人留言说VCS启动有些问题在文中没有解决,这里总结汇总了下从VCS安装好以后,临时license授权到使用VCS成功运行并用verdi dump波形这个过程中可能会遇到的一些问题及解决方法。关于VCS安装可以参考我之前写的文章。安装gcc 4.8即可,这里安装直接从官方下载安装即可,不建议使用安装包的方式完成,如果虚拟机不能联网,再尝试安装包的方式解决问题。
注:ALSR不负责代码段和数据段和地址随机化,这项工作PIE负责,但是只有ASLR开启的情况下,PIE才会生效。1、查看 cat /proc/sys/kernel/randomize_va_space。1:运行栈和共享库以及部分堆的随机化。2:在1的基础上包括所有堆的随机化。查看、开启、关闭ASLR。
《4——Linux二进制分析——学习——ptrace调试器》的补充。关于编译test的问题。
我直接通过gcc test.c -o test编译,在执行的时候会报错./testshare is not an ELF executable. The type: 3.我用readelf -h test去查看头文件的时候发现test的文件格式是 DYN (Shared object file),而我想...
今天再用addr2line 时, 发现不能给出行号,原来是gcc/g++编译器 -fPIC 引起的,参考:
处理segment fault 的一种方法_hjjdebug的博客-CSDN博客_segmentfault
编译需要加入-no-pie 就可以看到源码信息了.
如果在qt 工程里如何控制编译选项呢, 我包括查网络,主要也是自己试出来的,记录一下:
1. qmake -d 有 lots of message 输出, 可参考.
2. Makefile 内容
3. 网络
发现关键是
因为项目需要,要将程序编译成non-pie类型的,所以需要在其编译时为其指定-no-pie编译选项。该程序是使用cmake构建的,因此要在cmake时指定编译参数。
在命令行设定参数
cmake -DCMAKE_INSTALL_PREFIX=××× -DCMAKE_C_FLAGS=-no-pie -DCMAKE_CXX_FLAGS=-no-pie
这里顺带用CMAKE_INSTALL_PREFIX指定了安装路径,我所使用的就是这种方式。在网上看到还有其他方式,记录在下。
在CMakeLists.tx
Steps for building your application as PIE
In Xcode, select your target in the "Targets" section, then click the "Build Settings" tab to view its settings.
For iOS apps, set iOS Deployment Target to ...
输入命令gcc -m32 -no-pie -o linkbomb main.o phase1.o将两个可重定位进行连接的时候出错,报错:gcc: error: unrecognized command line option ‘-no-pie’
原因:centos默认gcc编译版本为4点几,所以需要升级gcc,这里使用yum install进行安装。
依次输入下面命令
sudo yum install centos-release-scl-rh
sudo yum install devtoolset
0x00 背景知识
ASLR(Address Space Layout Randomization)在2005年被引入到Linux的内核 kernel 2.6.12 中,当然早在2004年就以patch的形式被引入。随着内存地址的随机化,使得响应的应用变得随机。这意味着同一应用多次执行所使用内存空间完全不同,也意味着简单的缓冲区溢出攻击无法达到目的。
GDB从版本7开始,第一次在Ubuntu ......
My birthday is coming up and traditionally I’m serving pie. Not just one pie, no, I have a number N of them, of various tastes and of various sizes. F of my friends are coming to my party and each of t
混编.c与.cpp
通常是在C++项目引用了纯C语言的接口,需要extern "C"包含C语言接口头文件,且没有C语言库的情况下。这时候c的接口编译需要用gcc,而不是笼统的用g++来编译。
参考添加链接描述
relocation R_X86_64_32 against `.rodata’ can not be used when making a PIE object; recompile with -fPI
具体原理暂不清楚,但可以在报错编译的项目后添加 --no-pie
不让执行栈上的数据,于是JMP ESP就不能用了
Canary:-fno-stack-protector /-fstack-protector / -fstack-protector-all(关闭 / 开启 / 全开启)
栈里插入cookie信息
PIE:-no-pie / -pie (关闭 / 开启)
地址随机化,另外打开后会有get_pc_thunk
RELRO:-z norelro / -z lazy / -.