在寫C的過程中,我們會很自然地以為,我連續宣告一堆大小不一的char array。

經過Complier之後這些char array未必是連續擺放。至於為什麼就要談到我們今天的主角了alignment

以x86-32bit為例,

他喜歡一次讀取 4 Bytes (i.e. 32 bits),記憶中可以想成一格一格為 4 Bytes.其indes從 0 ~ 2^32 - 1

我們可以用 printf(sizeof(void *)); 來得知。machine在讀取指令時以多少Bytes為單位。

printf(sizeof(unsigned long));也行。

好讓每次讀取的位置皆為4的倍數,e.g. 0, 4, 8, 12 ...etc.

為了電腦的執行速度,Complier 會幫我們增加一些padding(填充),好讓每次讀取的位置都能是4的倍數。

實例:

在exploit(http://www.exploit-db.com/exploits/15285/)中

假設 def_ops 指向struct security_operations開頭

先看一下 Kernel source code

struct security_operations {
char name[SECURITY_NAME_MAX + ]; //SECURITY_NAME_MAX 預設10,所以我們知道為何target要+11
int (*ptrace_access_check) (struct task_struct *child, unsigned int mode);
int (*ptrace_traceme) (struct task_struct *parent);
....
http://lxr.linux.no/linux+v2.6.36/include/linux/security.h#L1363

解讀一下exploit

target = def_ops + sizeof(void *) + (( + sizeof(void *)) & ~(sizeof(void *) - )); //target想跳至ptrace_traceme
第一個 sizeof(void *) 因為要跳過  int (*ptrace_access_check) 這個pointer。
然而 name 這個 string 因為大小為11,但是為了做alignment。所以寫成
( + sizeof(void *)) & ~(sizeof(void *) - )

11 長度的char array 為了要入memory 又要 alignment 4 的倍數情況下,是要 給他三格(i.e. 12 Bytes)

多出的那 1 Bytes, 就是我們所謂的padding。  而"&"這邊的技巧在Linux Kernel也有用到[註1]。

& ~(sizeof(void *) - 1)  == & 1100   //sizeof(void *) = 4
而(11 + sizeof(void *)) & 1100 在 Binary的角度來看就是做mask來遮蔽後面2-bits
前面兩個2-bits則保留。而最後
(11 + sizeof(void *)) & ~(sizeof(void *) - 1) == 12 Bytes
用我們人類常用的10進位來舉例更貼近,假設記憶體中以0, 10, 20, 30 ...來存取指令。

假設有一到指令從0放到15的位置。為了alignment 10 的倍數, 我們必須這指令從0~20。

實作上就是 15 + 10 = 25 個位數的地方mask掉變成20。 就像前面我們做
& ~(sizeof(void *) - 1) 一樣。
[註1]
#define PAGE_MASK (~(PAGE_SIZE-1))

 http://lxr.free-electrons.com/source/arch/arm/include/asm/page.h#L15

Data structure alignment by binary operation的更多相关文章

  1. data structure alignment(数据对齐)

    概述: 数据对齐指数据在计算机内存中排放和获取的方式.包含三个方面:数据对齐(data alignment).数据结构填充(data alignment).打包(packing) 如果数据是自然对齐的 ...

  2. 对象内存 (扩展 Data Structure Alignment)

    对于一个class object来说,我们需要多少内存才能表现出来,大致分为3类,这里在前面文章有内存图 (1)非静态数据成员的综合大小,这也符合了c++对象模型的结构 (2)填充字节,就是我们所说的 ...

  3. CDOJ 483 Data Structure Problem DFS

    Data Structure Problem Time Limit: 20 Sec Memory Limit: 256 MB 题目连接 http://acm.uestc.edu.cn/#/proble ...

  4. 笔记-python-tutorial-5.data structure

    笔记-python-tutorial-5.data structure 1.      data structure 1.1.    list operation list.append(x) #尾部 ...

  5. hdu-5929 Basic Data Structure(双端队列+模拟)

    题目链接: Basic Data Structure Time Limit: 7000/3500 MS (Java/Others)    Memory Limit: 65536/65536 K (Ja ...

  6. HDU 5929 Basic Data Structure 模拟

    Basic Data Structure Time Limit: 7000/3500 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Oth ...

  7. HDU 5929 Basic Data Structure 【模拟】 (2016CCPC东北地区大学生程序设计竞赛)

    Basic Data Structure Time Limit: 7000/3500 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Oth ...

  8. [转]Data Structure Recovery using PIN and PyGraphviz

    Source:http://v0ids3curity.blogspot.com/2015/04/data-structure-recovery-using-pin-and.html --------- ...

  9. Basic Data Structure

    Basic Data Structure Time Limit: 7000/3500 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Oth ...

随机推荐

  1. Python之执行精确的浮点数运算

    有时候:代码上数字计算可能会有如同下面的误差 原因: 这些错误是由底层CPU和IEEE 754标准通过自己的浮点单位去执行算术时的特征. 由于Python的浮点数据类型使用底层表示存储数据,因此你没办 ...

  2. 选择 NoSQL 需要考虑的 10 个问题

    那么我为什么要写这篇文章呢? 是因为我认为NoSQL解决方案不如RDBMS解决方案吗?当然不! 是因为我专注于SQL的做事方式,而不想陷入一种相对较新的技术的不确定性吗?不,也不是!事实上,我非常兴奋 ...

  3. PHP多选测试练习

    <!DOCTYPE html> <html> <head> <meta charset="utf-8"> <title> ...

  4. javascript基础7(正则及表单验证)

    1.正则的概念     JS诞生的目的是什么?     就是为了做表单验证.       在JS未出现以前,表单的信息验证需要传输给后台,让后台做数据验证处理之后,再返回给前端页面处理的结果.在带宽有 ...

  5. ArrayListMultimap

    遇到这样一个场景,就是要判断传过来的Lists里有几组相邻的元素,然后有多少个单一的元素,比如3,3,3,4,4,4,5,5,5,6,6,6,8,9,10,11 方法有很多,但是我选了ArrayLis ...

  6. go语言从例子开始之Example18.struct结构体

    Go 的结构体 是各个字段字段的类型的集合.这在组织数据时非常有用 Example: package main import "fmt" type product struct{ ...

  7. 48th Numpy 常见数组

    1.全0数组 np.zeros(shape, dtype=float, order='C') 指定长度的一维数组 >>> np.zeros(5) array([ 0.,  0.,  ...

  8. solrconfig.xml主要配置项

    solrconfig.xml中的配置项主要分以下几大块: 1.依赖的lucene版本配置,这决定了你创建的Lucene索引结构,因为Lucene各版本之间的索引结构并不是完全兼容的,这个需要引起你的注 ...

  9. POJ 2240 Arbitrage (spfa判环)

    Arbitrage Arbitrage is the use of discrepancies in currency exchange rates to transform one unit of ...

  10. mysql学习-explain

    表头包含有: id---select_type---table---type---possible_keys---key---key_len---ref---rows---Extra id:selec ...