CTFshow-pwn入门-前置基础pwn26-pwn28

什么是ASLR

大多数的攻击都基于这样一个前提,即攻击者知道程序的内存布局,需要提前知道shellcode或者其他一些数据的位置。因此,引入内存布局的随机化能够有效增加漏洞利用的难度,其中一种技术就是ASLR(Address Space Layout Randomization)。ASLR提供的只是概率上的安全性,根据用于随机化的熵,攻击者有可能幸运地猜到正确的地址,有时攻击者还可以爆破。

在Linux上,ASLR的全局配置/proc/sts/kernel/randomize_va_space有三种情况:0表示关闭ASLR;1表示部分开启(将mmap的基址,stack和vdso页面随机化);2表示完全开启(在部分开启的基础上增加heap的随机化)。如下:
CTFshow-pwn入门-前置基础pwn26-pwn28_第1张图片
我们可以修改/proc/sts/kernel/randomize_va_space文件的值来配置ASLR。

pwn26

CTFshow-pwn入门-前置基础pwn26-pwn28_第2张图片
我们还是先下载pwn文件托到虚拟机加可执行权限使用checksec命令查看文件信息。
CTFshow-pwn入门-前置基础pwn26-pwn28_第3张图片
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;
}

CTFshow-pwn入门-前置基础pwn26-pwn28_第4张图片
我们从这几条语句可以得出,大概逻辑就是先读取我们系统中/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

CTFshow-pwn入门-前置基础pwn26-pwn28_第5张图片
这样我们就得到了正确的flag。

pwn27

CTFshow-pwn入门-前置基础pwn26-pwn28_第6张图片
我们还是先下载pwn文件托到虚拟机加可执行权限使用checksec命令查看文件信息。
CTFshow-pwn入门-前置基础pwn26-pwn28_第7张图片
还是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;
}

CTFshow-pwn入门-前置基础pwn26-pwn28_第8张图片
这道题目相较于上道题目,是/proc/sys/kernel/randomize_va_space这个文件的内容为0或者1都可以得到正确的flag。由于我们在上到题目中已经把/proc/sys/kernel/randomize_va_space这个文件中的内容改为了0,所以我们直接运行pwn文件就能拿到flag了。
CTFshow-pwn入门-前置基础pwn26-pwn28_第9张图片

pwn28

CTFshow-pwn入门-前置基础pwn26-pwn28_第10张图片
我们还是先下载pwn文件托到虚拟机加可执行权限使用checksec命令查看文件信息。
CTFshow-pwn入门-前置基础pwn26-pwn28_第11张图片
还是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;
}

CTFshow-pwn入门-前置基础pwn26-pwn28_第12张图片
这道题目比前两道题好像还简单,什么限制都没有,直接运行就能拿flag,天大的好事呀!!!
CTFshow-pwn入门-前置基础pwn26-pwn28_第13张图片

你可能感兴趣的:(CTFShow,pwn,linux,安全,网络安全)