缓冲区溢出,不是预期的结果

时间:2013-08-14 05:27:28

标签: c buffer-overflow

您好我正在学习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?任何其他方式我可以检查程序执行时发生的事情。

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

5 个答案:

答案 0 :(得分:0)

指定指针与复制缓冲区不同。你可能意味着:

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

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

答案 1 :(得分:0)

我知道这不会回答这个问题,但它会让你知道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

答案 2 :(得分:0)

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

      gcc -g -o testsc testsc.c

      gdb testsc

      (gdb)break main
      (gdb)print ret
      (gdb)print *ret

并逐步完成代码。

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

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

还可以使用

查看汇编代码
          gcc -S testsc.c

答案 3 :(得分:0)

  

为何退出?

如果输入是在EOF,则

sh打印exit,例如,当按下Ctrl D时;如果你没有这样做,那么EOF必须有其他原因。

  

任何其他方式我可以检查我的程序在里面发生了什么   执行。

由于您的程序已成功执行/bin/sh,因此我认为使用调试器检查内部程序是没有意义的。我查看strace testsc的输出(也跟踪shell);接近结束时,我们应该看到read调用,该调用应该为sh获取命令行输入;也许从返回的值和错误号,我们可以推断出EOF的原因,或者我们可以看到使用的文件描述符的来源。

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

答案 4 :(得分:-2)

缓冲区溢出?

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