4

编码:

void doit()
{       
      system("/bin/sh");
      exit(0); 
}       

int main(int argc, char **argv)
{       
    static int the_var;
    char buf[512];

    the_var = 20;

    strncpy (buf, argv[1], sizeof(buf) - 1);

    printf (buf);

    if (the_var != 20)
    {
            doit();
    } else {
            printf ("\nthe_var @ 0x%08x = %d 0x%08x\n", &the_var, the_var, the_var);
    }
}

程序以粘性位(所有者 uid 0)运行,我所要做的就是破解它并/bin/sh以 root 身份运行。

我知道如何用fe. 缓冲区溢出和strcpy(shellcode),但不要在这个上使用“格式字符串攻击”。

如您所见,有一个var the_var,如果它不等于 50 则 shell 正在运行(也许尝试以某种方式更改它,一些肮脏的魔法?)。无论如何,有一个printf (buf)

4

1 回答 1

5

你控制buf。传递%x格式字符串以转储堆栈并%n覆盖堆栈中的对象the_var。如果对象the_var被覆盖,则从您的程序doit中调用并/bin/sh执行该函数。

于 2012-06-17T09:06:14.877 回答