【问题标题】:Layout of stat struct in x86x86 中 stat 结构的布局
【发布时间】:2014-09-18 20:16:47
【问题描述】:

当我遇到一个关于查看 linux 的 struct stat 的问题时,我正在做一个逆向工程练习。当我出于某种原因编译我的代码时,这些字段没有按照我的预期对齐。 st_dev 和 st_ino 之间似乎有两个 0 字的差距,我不明白为什么这只是编译时使用的。

gcc -m32 struct.c

结构体.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/exercises/per_chapter/struct_exercise_Linux86.tar 来自http://beginners.re/ 20.7.1 练习#1 焦油

【问题讨论】:

  • gcc -m32 -O1 -fverbose-asm -S struct.c编译并使用offsetof(3)
  • st_dev 类型比您想象的要宽。
  • @Jongware,是的,显然这是一个四字。

标签: c linux linux-kernel x86


【解决方案1】:

真正的stat 结构在/usr/include/bits/stat.h 中定义(包含在&lt;sys/stat.h&gt; 中)。你会明白那里的偏移量。

【讨论】:

  • st_dev 是一个四字,在 /usr/include/bits/stat.h 之后添加了 paddin 似乎是原因
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-12-30
  • 2011-02-14
  • 1970-01-01
  • 1970-01-01
  • 2018-08-30
相关资源
最近更新 更多