#include <stdio.h>
#include <stdlib.h>
int main()
{
char *name;
char *command;
name=(char *)malloc(10);
command=(char *)malloc(128);
printf("address of name is : %d\n",name);
printf("address of command is:%d\n",command);
printf("Distance between addresses is :%d\n",command-name);
printf("Enter your name:");
gets(name);
printf("Hello %s\n",name);
system(command);
}
分配恆定內存量(緩衝區大小)和兩個地址(相鄰內存塊)之間的距離有什麼區別?在這個例子中,名稱和命令之間的區別是16字節,名稱的緩衝區大小是10字節。哪一個會觸發緩衝區溢出?緩衝區大小和兩個地址之間的距離有什麼區別?
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
// typedef size_t u_long;
int main(){
u_long distance;
char *buf1= (char *)malloc(16);
char *buf2= (char *)malloc(16);
distance= (u_long)buf2 - (u_long)buf1;
printf("buf1 = %p\nbuf2 = %p\ndistance = 0x%x bytes\n",
buf1, buf2, distance);
memset(buf2, 'A', 15); buf2[15]='\0';
printf("before overflow buf2 = %s\n", buf2);
memset(buf1, 'B', (8+distance));
printf("after overflow buf2 = %s\n", buf2);
return 0;
}
那麼,要觸發緩衝區溢出,你必須知道兩個相鄰地址之間的距離。例如,如果我們輸入1234567891234567/bin/sh,我們將獲得一個命令shell,因此第16個字符後面的所有內容都將替換命令的內容並將被執行。 – c0ldhand
但是,在上面的第二個例子中,我們沒有使用距離,我們使用分配的緩衝區大小來觸發16字節的緩衝區溢出。 – c0ldhand
那麼示例1和示例2有什麼區別? – c0ldhand