《深入理解计算机系统》Machine level programming-V Advanced topics

《深入理解计算机系统》Machine level programming-V Advanced topics

《深入理解计算机系统》Machine level programming-V Advanced topics

《深入理解计算机系统》Machine level programming-V Advanced topics

《深入理解计算机系统》Machine level programming-V Advanced topics

B    0

KB    3

MB    6

GB    9

TB     12

PB  pegabytes  15

EB Exabyte  18

ZB Zettabyte  21

0x0000 7FFF FFFF FFFF 这个地址在Linux中为栈的起始地址。

《深入理解计算机系统》Machine level programming-V Advanced topics

不安全的函数:

gets

strcpy

strcat

sscanf fscanf scanf  当传入%s时

栈溢出:

如果发生栈溢出,则由很大可能栈空间的返回地址会被篡改,程序会跳到某个地方。

代码注入攻击则利用这个原理,将原栈空间破坏,跳转到目标地址。

目前,系统层面上,有一些防治代码注入的方法:

1. ASLR(Address space layout randomization)地址空间布局随机化,global val 和 code segment 每次运行地址不变,heap和stack地址每次运行都会变化。

2. nonexecutable code segment,可以避免利用漏洞导致的内存覆盖。有的内存块可写,有的内存块只读。另外,栈设置成不可执行,不能放置代码段。

3. gcc 的编译选项:-fstack-protector(金丝雀)

如果检测到栈溢出,则会打印:stack smashing detected,简易原理图:

《深入理解计算机系统》Machine level programming-V Advanced topics

gdb 命令:查看某个函数的反汇编:

disass echo

gadget

大小端:

小端:

《深入理解计算机系统》Machine level programming-V Advanced topics

《深入理解计算机系统》Machine level programming-V Advanced topics