什么是ASLR
大多数的攻击都基于这样一个前提,即攻击者知道程序的内存布局,需要提前知道shellcode或者其他一些数据的位置。因此,引入内存布局的随机化能够有效增加漏洞利用的难度,其中一种技术就是ASLR(Address Space Layout Randomization)。ASLR提供的只是概率上的安全性,根据用于随机化的熵,攻击者有可能幸运地猜到正确的地址,有时攻击者还可以爆破。
在Linux上,ASLR的全局配置/proc/sts/kernel/randomize_va_space有三种情况:0表示关闭ASLR;1表示部分开启(将mmap的基址,stack和vdso页面随机化);2表示完全开启(在部分开启的基础上增加heap的随机化)。如下:
我们可以修改/proc/sts/kernel/randomize_va_space文件的值来配置ASLR。
pwn26
我们还是先下载pwn文件托到虚拟机加可执行权限使用checksec命令查看文件信息。
pwn文件是64位的,直接拖进ida64反编译看源码:
int __cdecl main(int argc, const char **argv, const char **envp)
{
void *ptr; // [rsp+0h] [rbp-10h]
void *v5; // [rsp+8h] [rbp-8h]
ptr = malloc(4uLL);
v5 = dlopen("/lib/x86_64-linux-gnu/libc.so.6", 258);
puts(s);
puts(asc_4008F0);
puts(asc_400970);
puts(asc_400A00);
puts(asc_400A90);
puts(asc_400B18);
puts(asc_400BB0);
puts(" * ************************************* ");
puts(aClassifyCtfsho);
puts(" * Type : Linux_Security_Mechanisms ");
puts(" * Site : https://ctf.show/ ");
puts(" * Hint : Please confirm your ASLR level first ! ");
puts(" * ************************************* ");
puts("Here is your ASLR level:");
system("cat /proc/sys/kernel/randomize_va_space");
puts("If the result is 0, then you get the correct flag!");
puts("If not,you will get a fake flag!");
printf("flag is :ctfshow{%p", main);
printf("_%p", system);
printf("_%p", ptr);
printf("_%p", v5);
puts("}");
free(ptr);
return 0;
}
我们从这几条语句可以得出,大概逻辑就是先读取我们系统中/proc/sys/kernel/randomize_va_space文件的内容,若里面的内容是0,那接下来输出的flag就是正确的,如果文件的内容不是0,那么输出的flag就是错的。
那好,我们先看我们系统中的/proc/sys/kernel/randomize_va_space文件的内容是否为0。
cat /proc/sys/kernel/randomize_va_space
看到我们的内容不是0,而是2。那么我们就得把它改为0。
注意,我们要更改/proc/sys/kernel/randomize_va_space,就必须将用户切换到root,不然是改不了的。
su root
echo 0 > /proc/sys/kernel/randomize_va_space
./pwn
这样我们就得到了正确的flag。
pwn27
我们还是先下载pwn文件托到虚拟机加可执行权限使用checksec命令查看文件信息。
还是64位的,我们还是拖进ida64反编译一下。
int __cdecl main(int argc, const char **argv, const char **envp)
{
void *ptr; // [rsp+0h] [rbp-10h]
ptr = malloc(4uLL);
dlopen("./libc-2.27.so", 258);
puts(s);
puts(asc_4008D0);
puts(asc_400950);
puts(asc_4009E0);
puts(asc_400A70);
puts(asc_400AF8);
puts(asc_400B90);
puts(" * ************************************* ");
puts(aClassifyCtfsho);
puts(" * Type : Linux_Security_Mechanisms ");
puts(" * Site : https://ctf.show/ ");
puts(" * Hint : Please confirm your ASLR level first ! ");
puts(" * ************************************* ");
puts("Here is your ASLR level:");
system("cat /proc/sys/kernel/randomize_va_space");
puts("If the result is 0 or 1, then you get the correct flag!");
puts("If not,you will get a fake flag!");
printf("flag is :ctfshow{%p", main);
printf("_%p", system);
printf("_%p", ptr);
puts("}");
free(ptr);
return 0;
}
这道题目相较于上道题目,是/proc/sys/kernel/randomize_va_space这个文件的内容为0或者1都可以得到正确的flag。由于我们在上到题目中已经把/proc/sys/kernel/randomize_va_space这个文件中的内容改为了0,所以我们直接运行pwn文件就能拿到flag了。
pwn28
我们还是先下载pwn文件托到虚拟机加可执行权限使用checksec命令查看文件信息。
还是64位的,我们还是拖进ida64反编译一下。
int __cdecl main(int argc, const char **argv, const char **envp)
{
void *ptr; // [rsp+0h] [rbp-10h]
ptr = malloc(4uLL);
dlopen("./libc-2.27.so", 258);
puts(s);
puts(asc_4008A0);
puts(asc_400920);
puts(asc_4009B0);
puts(asc_400A40);
puts(asc_400AC8);
puts(asc_400B60);
puts(" * ************************************* ");
puts(aClassifyCtfsho);
puts(" * Type : Linux_Security_Mechanisms ");
puts(" * Site : https://ctf.show/ ");
puts(" * Hint : Please confirm your ASLR level first ! ");
puts(" * ************************************* ");
puts("Here is your ASLR level:");
system("cat /proc/sys/kernel/randomize_va_space");
printf("flag is :ctfshow{%p", main);
printf("_%p", system);
puts("}");
free(ptr);
return 0;
}
这道题目比前两道题好像还简单,什么限制都没有,直接运行就能拿flag,天大的好事呀!!!