逆向-beginners之结构体嵌套

#include <stdio.h>

/*
 * 嵌套
 */

struct inner_struct
{
    int a;
    int b;
};

struct outer_struct
{
    char a;
    int b;
    struct inner_struct c;
    char d;
    int e;
};

void f(struct outer_struct s)
{
    printf("a=%d,b=%d,c.a=%d,c.b=%d,d=%d,e=%d\n",
                    s.a, s.b, s.c.a, s.c.b, s.d, s.e);
}

int main()
{
    struct outer_struct s;

    s.a = 1;
    s.b = 2;
    s.c.a = 100;
    s.c.b = 101;
    s.d = 3;
    s.e = 4;

    f(s);
}

#if 0
/*
 * intel
 */
0000000000001149 <f>:
    1149:    f3 0f 1e fa              endbr64            // rsp=0x7fffffffe0f8    rbp=0x7fffffffe140
    114d:    55                       push   %rbp        // rsp=rsp-0x48-0x8=rsp-0x50    rsp=0x7fffffffe0f0    rbp=0x7fffffffe140
    114e:    48 89 e5                 mov    %rsp,%rbp    // rbp=rsp-0x50    rsp=rbp=0x7fffffffe0f0
    1151:    8b 75 24                 mov    0x24(%rbp),%esi    // esi=(rbp-0x50+0x24)    (rbp+0x24)=0x7fffffffe114: 0x00000004
    1154:    0f b6 45 20              movzbl 0x20(%rbp),%eax    // 0x20(%rbp)=0x7fffffffe110: 0xffffe203
    1158:    44 0f be c0              movsbl %al,%r8d            // al=0x3    r8d=0x3
    115c:    8b 7d 1c                 mov    0x1c(%rbp),%edi    // 0x7fffffffe10c: 0xffffe20300000065    edi=0x65
    115f:    8b 4d 18                 mov    0x18(%rbp),%ecx    // 0x7fffffffe108: 0x0000006500000064    ecx=0x64
    1162:    8b 55 14                 mov    0x14(%rbp),%edx    // 0x7fffffffe104: 0x0000006400000002    edx=0x2
    1165:    0f b6 45 10              movzbl 0x10(%rbp),%eax    // 0x7fffffffe100: 0x0000000200000001    eax=0x1
    1169:    0f be c0                 movsbl %al,%eax            // al=0x1    eax=0x1
    116c:    48 83 ec 08              sub    $0x8,%rsp        // rsp=0x7fffffffe0e8    rbp=0x7fffffffe0f0
    1170:    56                       push   %rsi                // rsp=0x7fffffffe0e0    rbp=0x7fffffffe0f0    rsi=0x4
    1171:    45 89 c1                 mov    %r8d,%r9d        // r9d=0x3
    1174:    41 89 f8                 mov    %edi,%r8d        // r8d=0x65
    1177:    89 c6                    mov    %eax,%esi        // esi=0x1
    1179:    48 8d 3d 88 0e 00 00     lea    0xe88(%rip),%rdi        # 2008 <_IO_stdin_used+0x8>
    1180:    b8 00 00 00 00           mov    $0x0,%eax
    1185:    e8 c6 fe ff ff           callq  1050 <printf@plt>    // printf(rdi, esi, edx, ecx, r8d, r9d, rsp)
    118a:    48 83 c4 10              add    $0x10,%rsp
    118e:    90                       nop
    118f:    c9                       leaveq 
    1190:    c3                       retq   

0000000000001191 <main>:
    1191:    f3 0f 1e fa              endbr64                // rsp=0x7fffffffe148    rbp=0
    1195:    55                       push   %rbp            // rsp=0x7fffffffe140    rbp=0
    1196:    48 89 e5                 mov    %rsp,%rbp        // rbp=rsp=0x7fffffffe140
    1199:    48 83 ec 20              sub    $0x20,%rsp        // rsp=0x7fffffffe120    rbp=0x7fffffffe140
    119d:    c6 45 e0 01              movb   $0x1,-0x20(%rbp)        // (rbp-0x20)=0x1        0x7fffffffe120: 0x00000001
    11a1:    c7 45 e4 02 00 00 00     movl   $0x2,-0x1c(%rbp)        // (rbp-0x1c)=0x2        0x7fffffffe124: 0x00000002
    11a8:    c7 45 e8 64 00 00 00     movl   $0x64,-0x18(%rbp)    // (rbp-0x18)=0x64        0x7fffffffe128: 0x00000064
    11af:    c7 45 ec 65 00 00 00     movl   $0x65,-0x14(%rbp)    // (rbp-0x14)=0x65        0x7fffffffe12c: 0x00000065
    11b6:    c6 45 f0 03              movb   $0x3,-0x10(%rbp)        // (rbp-0x10)=0x3        0x7fffffffe130: 0xffffe203
    11ba:    c7 45 f4 04 00 00 00     movl   $0x4,-0xc(%rbp)        // (rbp-0xc)=0x4        0x7fffffffe134: 0x00000004
    11c1:    48 83 ec 08              sub    $0x8,%rsp        // rsp=rsp-8=rsp-0x28        rsp=0x7fffffffe118    rbp=0x7fffffffe140
    11c5:    ff 75 f0                 pushq  -0x10(%rbp)        // rsp-0x30=0x3                rsp=0x7fffffffe110:0xffffe203
    11c8:    ff 75 e8                 pushq  -0x18(%rbp)        // rsp-0x38=0x64            rsp=0x7fffffffe108:0x00000064
    11cb:    ff 75 e0                 pushq  -0x20(%rbp)        // rsp-0x40=0x1                rsp=0x7fffffffe100:0x00000001
    11ce:    e8 76 ff ff ff           callq  1149 <f>            // rsp=rsp-0x48 f(rbp-0x40)    rsp=0x7fffffffe0f8 rbp=0x7fffffffe140
    11d3:    48 83 c4 20              add    $0x20,%rsp
    11d7:    b8 00 00 00 00           mov    $0x0,%eax
    11dc:    c9                       leaveq         // 0x28-0x18=0x40
    11dd:    c3                       retq   
    11de:    66 90                    xchg   %ax,%ax

(gdb) x/20w $rsp+0x10    ===> 0x7fffffffe0f0+0x10=0x7fffffffe100
0x7fffffffe100: 0x00000001      0x00000002      0x00000064      0x00000065
0x7fffffffe110: 0xffffe203      0x00000004      0x555551e0      0x00005555
0x7fffffffe120: 0x00000001      0x00000002      0x00000064      0x00000065
0x7fffffffe130: 0xffffe203      0x00000004      0x00000000      0x00000000
0x7fffffffe140: 0x00000000      0x00000000      0xf7de00b3      0x00007fff

(gdb) x/20g $rsp+0x10
0x7fffffffe100: 0x0000000200000001      0x0000006500000064
0x7fffffffe110: 0x00000004ffffe203      0x00005555555551e0
0x7fffffffe120: 0x0000000200000001      0x0000006500000064
0x7fffffffe130: 0x00000004ffffe203      0x0000000000000000
0x7fffffffe140: 0x0000000000000000      0x00007ffff7de00b3
0x7fffffffe150: 0x00007ffff7ffc620      0x00007fffffffe238
0x7fffffffe160: 0x0000000100000000      0x0000555555555191
0x7fffffffe170: 0x00005555555551e0      0x8aa22c405dddec8e
0x7fffffffe180: 0x0000555555555060      0x00007fffffffe230
0x7fffffffe190: 0x0000000000000000      0x0000000000000000

/*
 * arm
 */
000000000040055c <f>:
  40055c:    a9be7bfd     stp    x29, x30, [sp, #-32]!
  400560:    910003fd     mov    x29, sp        // x29=sp
  400564:    f9000bf3     str    x19, [sp, #16]    // [sp+16]=x19
  400568:    aa0003f3     mov    x19, x0        // x19=x0
  40056c:    39400260     ldrb    w0, [x19]    // w0=1
  400570:    2a0003e7     mov    w7, w0        // w7=1
  400574:    b9400661     ldr    w1, [x19, #4]    // w1=2
  400578:    b9400a62     ldr    w2, [x19, #8]    // w2=100
  40057c:    b9400e63     ldr    w3, [x19, #12]    // w3=101
  400580:    39404260     ldrb    w0, [x19, #16]    // w0=3
  400584:    2a0003e5     mov    w5, w0        // w5=3
  400588:    b9401664     ldr    w4, [x19, #20]    // w4=4
  40058c:    90000000     adrp    x0, 400000 <_init-0x3e8>
  400590:    911b4000     add    x0, x0, #0x6d0
  400594:    2a0403e6     mov    w6, w4        // w6=4
  400598:    2a0303e4     mov    w4, w3        // w4=101
  40059c:    2a0203e3     mov    w3, w2        // w3=100
  4005a0:    2a0103e2     mov    w2, w1        // w2=2
  4005a4:    2a0703e1     mov    w1, w7        // w1=1
  4005a8:    97ffffaa     bl    400450 <printf@plt>    // printf(x0, w1, w2, w3, w4, w5, w6)
  4005ac:    d503201f     nop
  4005b0:    f9400bf3     ldr    x19, [sp, #16]
  4005b4:    a8c27bfd     ldp    x29, x30, [sp], #32
  4005b8:    d65f03c0     ret

00000000004005bc <main>:
  4005bc:    a9bb7bfd     stp    x29, x30, [sp, #-80]!
  4005c0:    910003fd     mov    x29, sp
  4005c4:    52800020     mov    w0, #0x1                       // #1
  4005c8:    3900e3a0     strb    w0, [x29, #56]
  4005cc:    52800040     mov    w0, #0x2                       // #2
  4005d0:    b9003fa0     str    w0, [x29, #60]
  4005d4:    52800c80     mov    w0, #0x64                      // #100
  4005d8:    b90043a0     str    w0, [x29, #64]
  4005dc:    52800ca0     mov    w0, #0x65                      // #101
  4005e0:    b90047a0     str    w0, [x29, #68]
  4005e4:    52800060     mov    w0, #0x3                       // #3
  4005e8:    390123a0     strb    w0, [x29, #72]
  4005ec:    52800080     mov    w0, #0x4                       // #4
  4005f0:    b9004fa0     str    w0, [x29, #76]
  4005f4:    910043a2     add    x2, x29, #0x10        // x2=x29+0x10
  4005f8:    9100e3a3     add    x3, x29, #0x38        // x3=x29+0x38 (56)
  4005fc:    a9400460     ldp    x0, x1, [x3]        // x0=[x3]=1, x1=[x3+8]=100
  400600:    a9000440     stp    x0, x1, [x2]        // [x2]=x0=1, [x2+8]=x1=100
  400604:    f9400860     ldr    x0, [x3, #16]        // x0=[x3+16]=3
  400608:    f9000840     str    x0, [x2, #16]        // [x2+16]=x0=3
  40060c:    910043a0     add    x0, x29, #0x10        // x0=x29+0x10
  400610:    97ffffd3     bl    40055c <f>        // f(x29+0x10)
  400614:    52800000     mov    w0, #0x0                       // #0
  400618:    a8c57bfd     ldp    x29, x30, [sp], #80
  40061c:    d65f03c0     ret

#endif

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 很抱歉,我是一名AI语言模型,无法进行安装操作。但是,我可以提供一些安装ROS Academy for Beginners的指导: 1. 首先,确保你的计算机已经安装了ROS(Robot Operating System)。 2. 在终端中输入以下命令,下载ROS Academy for Beginners: ``` git clone https://github.com/qboticslabs/ros-academy-for-beginners.git ``` 3. 进入下载的文件夹: ``` cd ros-academy-for-beginners ``` 4. 运行安装脚本: ``` ./install.sh ``` 5. 安装完成后,你可以在终端中输入以下命令,启动ROS Academy for Beginners: ``` roslaunch academy academy.launch ``` 希望这些指导能够帮助你安装ROS Academy for Beginners。如果你遇到了任何问题,可以在ROS社区中寻求帮助。 ### 回答2: 首先,安装ROS的前提是已经安装好了Ubuntu操作系统,推荐使用Ubuntu 18.04。可以从Ubuntu的官网上下载系统镜像并且安装。 其次,在安装ROS之前,需要先添加ROS的软件源,这里以Melodic版本为例。打开终端,输入以下命令,添加ROS的软件源: ``` sudo sh -c 'echo "deb http://packages.ros.org/ros/ubuntu $(lsb_release -sc) main" > /etc/apt/sources.list.d/ros-latest.list' ``` 由于ROS的安装需要与ubuntu操作系统的软件进行整合,为了确保最佳匹配,需要先运行以下命令进行更新: ``` sudo apt update sudo apt upgrade ``` 然后是ROS的安装,运行以下命令: ``` sudo apt install ros-melodic-desktop-full ``` 该命令会安装ROS桌面完整版,其中包含许多常用的软件包和工具。安装完成后,可以通过以下命令检查ROS的版本: ``` rosversion -d ``` 接下来,还需配置ROS环境变量。在终端中输入: ``` echo "source /opt/ros/melodic/setup.bash" >> ~/.bashrc source ~/.bashrc ``` 安装ROS的最后一步是安装ROS初始工作区(catkin工作区)。打开终端,输入以下命令: ``` mkdir -p ~/catkin_ws/src cd ~/catkin_ws/ catkin_make ``` 这个命令创建一个名为catkin_ws的文件夹,并在其中创建一个src文件夹,用于存放ROS软件包源代码。 最后,我们可以安装ros-academy-for-beginners这个包,这个包可以用于学习ROS的基础知识,包括ROS的概念、练习和示例等等。在终端输入以下命令: ``` cd ~/catkin_ws/src git clone https://github.com/OTL/ros-academy-for-beginners.git cd ~/catkin_ws catkin_make ``` 至此,ros-academy-for-beginners的安装就完成了。如果想要使用该软件包内的示例和练习程序,可以查看ros-academy-for-beginners中的README文件,然后通过以下命令运行: ``` roslaunch ros_academy_publisher publisher.launch ``` ### 回答3: ROS(机器人操作系统)是一种流行的开源软件框架,它可以帮助开发人员为机器人软件构建底层、中间层、以及可视化的应用程序。ROS Academy for Beginners是一个为初学者提供ROS学习和实践的平台,这个平台包含了一系列的教程,如基础知识、机器人操作、感知和导航等。 在安装ROS Academy for Beginners之前,首先需要准备以下工具: 1. 一个ROS Kinetic(或更高版本)的Ubuntu操作系统。 2. 一个支持VirtualBox或VMware的虚拟机管理软件。 3. 一个ROS学习环境的Ubuntu虚拟机镜像文件。 下面是安装ROS Academy for Beginners的步骤: 1. 在VirtualBox(或其他虚拟机软件)中创建一台新的虚拟机。请确保选择Ubuntu x64的版本。 2. 启动Ubuntu虚拟机,并使用管理员权限运行Terminal。 3. 输入以下命令,添加ROS Kinetic的存储库以及密钥: $ sudo sh -c 'echo "deb http://packages.ros.org/ros/ubuntu $(lsb_release -sc) main" > /etc/apt/sources.list.d/ros-latest.list' $ sudo apt-key adv --keyserver hkp://ha.pool.sks-keyservers.net:80 --recv-key 421C365BD9FF1F717815A3895523BAEEB01FA116 4. 更新存储库并安装ROS Kinetic Desktop Full: $ sudo apt-get update $ sudo apt-get install ros-kinetic-desktop-full 5. 安装ROS依赖项: $ sudo apt-get install python-rosdep python-rosinstall python-rosinstall-generator python-wstool build-essential 6. 初始化rosdep: $ sudo rosdep init $ rosdep update 7. 设置ROS环境变量: $ echo "source /opt/ros/kinetic/setup.bash" >> ~/.bashrc $ source ~/.bashrc 8. 下载ROS Academy for Beginners虚拟机镜像: $ wget https://s3-us-west-2.amazonaws.com/ros-academy/ROS-Academy-For-Beginners.ova 9. 启动VirtualBox软件,选择“File” -> “Import Appliance”,并选择已下载的ROS Academy for Beginners虚拟机镜像文件。 10. 等待虚拟机导入完成后,启动ROS Academy for Beginners虚拟机,并按照教程开始学习ROS! 希望这些步骤可以帮助您安装ROS Academy for Beginners。如果您在安装过程中遇到任何问题,请参考ROS官方文档或社区论坛,寻求帮助。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值