2014-09-18 62 views
0

当我遇到一个处理查看linux结构统计信息的问题时,我正在运行反向工程练习。当我编译我的代码出于某种原因时,这些字段没有按照我的预期进行对齐。在st_dev和st_ino之间出现了两个两个0字的间隔,我不明白为什么这只是编译的。x86中stat结构的布局

的gcc -m32 struct.c

Struct.c

#include <sys/types.h> 
#include <sys/stat.h> 
#include <time.h> 
#include <stdio.h> 
#include <stdlib.h> 
int main(int argc, char *argv[]) 
{ 
    struct stat sb; 

    sb.st_dev=0xbeef; 
    sb.st_ino=0xdead; 
    sb.st_mode=0xfeed; 
    sb.st_nlink=0xffff; 
    sb.st_uid=0x888f; 
} 

初步认识大会

08048374 <main>: 
8048374: 8d 4c 24 04    lea 0x4(%esp),%ecx 
8048378: 83 e4 f0    and $0xfffffff0,%esp 
804837b: ff 71 fc    pushl 0xfffffffc(%ecx) 
804837e: 55      push %ebp 
804837f: 89 e5     mov %esp,%ebp 
8048381: 51      push %ecx 
8048382: 83 ec 60    sub $0x60,%esp 
8048385: c7 45 a4 ef be 00 00 movl $0xbeef,0xffffffa4(%ebp) 
804838c: c7 45 a8 00 00 00 00 movl $0x0,0xffffffa8(%ebp) 
8048393: c7 45 b0 ed be 00 00 movl $0xdead,0xffffffb0(%ebp) 
804839a: c7 45 b4 ed fe 00 00 movl $0xfeed,0xffffffb4(%ebp) 
80483a1: c7 45 b8 ff ff 00 00 movl $0xffff,0xffffffb8(%ebp) 
80483a8: c7 45 bc 8f 88 00 00 movl $0x888f,0xffffffbc(%ebp) 
80483af: 83 c4 60    add $0x60,%esp 

我预计0xdead是在0xffffffa8(%EBP),但不要不明白为什么事情不是这样。

作为参考我对着此二进制,和什么领域是印刷表示从http://beginners.re/ 20.7.1练习#1 焦油

+0

用'gcc -m32 -O1 -fverbose-asm -S struct.c'编译并使用[offsetof(3)](http://man7.org/linux/man-pages/man3/offsetof.3。 html) – 2014-09-18 20:21:13

+0

'st_dev'类型比你想象的要宽。 – usr2564301 2014-09-18 20:27:33

+0

@Jongware,是的显然它是一个四字。 – 2014-09-18 20:49:25

回答