您好我正在学习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
?任何其他方式我可以检查程序执行时发生的事情。
如果我的方法不够好,我还能尝试什么?
答案 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");