当前位置: 首页 > news >正文

逆向-beginners之helloworld

#include <stdio.h>

int _main()
{
    printf("hello world.\n");
    return 0;
}

// 上面的代码等效于:
char *SG3830[] = {"hello, world\n"};

int main()
{
    printf("%s", *SG3830);
    return 0;
}

#if 0
/*
 * intel
 */
0000000000001169 <_main>:
    1169:    f3 0f 1e fa              endbr64
    116d:    55                       push   %rbp
    116e:    48 89 e5                 mov    %rsp,%rbp
    1171:    48 8d 3d 8c 0e 00 00     lea    0xe8c(%rip),%rdi        # 2004 <_IO_stdin_used+0x4>  // rdi="hello world.\n"
    1178:    e8 e3 fe ff ff           callq  1060 <puts@plt>          // puts(rdi)
    117d:    b8 00 00 00 00           mov    $0x0,%eax
    1182:    5d                       pop    %rbp
    1183:    c3                       retq   

0000000000001184 <main>:
    1184:    f3 0f 1e fa              endbr64
    1188:    55                       push   %rbp
    1189:    48 89 e5                 mov    %rsp,%rbp
    118c:    48 8b 05 7d 2e 00 00     mov    0x2e7d(%rip),%rax        # 4010 <SG3830>
    1193:    48 89 c6                 mov    %rax,%rsi                // rsi="hello world.\n"
    1196:    48 8d 3d 82 0e 00 00     lea    0xe82(%rip),%rdi        # 201f <_IO_stdin_used+0x1f> // rdi="%s"
    119d:    b8 00 00 00 00           mov    $0x0,%eax
    11a2:    e8 c9 fe ff ff           callq  1070 <printf@plt>        // printf(rdi, rsi)
    11a7:    b8 00 00 00 00           mov    $0x0,%eax
    11ac:    5d                       pop    %rbp
    11ad:    c3                       retq   
    11ae:    66 90                    xchg   %ax,%ax

/*
 * arm
 */
00000000004005ac <_main>:
  4005ac:    a9bf7bfd     stp    x29, x30, [sp, #-16]!
  4005b0:    910003fd     mov    x29, sp
  4005b4:    90000000     adrp    x0, 400000 <_init-0x428>
  4005b8:    911aa000     add    x0, x0, #0x6a8              // x0="hello world.\n"
  4005bc:    97ffffb5     bl    400490 <puts@plt>           // puts(x0)
  4005c0:    52800000     mov    w0, #0x0                       // #0
  4005c4:    a8c17bfd     ldp    x29, x30, [sp], #16
  4005c8:    d65f03c0     ret

00000000004005cc <main>:
  4005cc:    a9bf7bfd     stp    x29, x30, [sp, #-16]!
  4005d0:    910003fd     mov    x29, sp
  4005d4:    b0000080     adrp    x0, 411000 <__libc_start_main@GLIBC_2.17>
  4005d8:    9100e000     add    x0, x0, #0x38
  4005dc:    f9400001     ldr    x1, [x0]        // x1="hello world.\n"
  4005e0:    90000000     adrp    x0, 400000 <_init-0x428>
  4005e4:    911b2000     add    x0, x0, #0x6c8  // x0="%s"
  4005e8:    97ffffae     bl    4004a0 <printf@plt> // printf(x0, x1)
  4005ec:    52800000     mov    w0, #0x0                       // #0
  4005f0:    a8c17bfd     ldp    x29, x30, [sp], #16
  4005f4:    d65f03c0     ret


#endif

#if 0
/*
 *  intel
 */
    xor eax, eax
    mov eax, 0
    两条指令结果相同,但xor 异或运算的opcode较短。

    也有一些编译器使用 sub eax, eax 把eax置0。

/*
 * gcc
 */
main     proc near
var_10     = dword ptr - 10h

    push ebp
    mov ebp, esp
    and esp, fffffff0    # 令栈地址(ESP的值)向16字节边界对齐(成为16的整数倍)
    sub esp, 10
    mov eax, offset HelloWord    ; "hello, world\n"字符串在数据段地址(指针)存储到EAX
    mov [esp+10+var_10], eax    ; 再把它存储在数据栈里
    call _printf
    mov eax, 0
    leave
    retn

main endp

    如钩地址位没有对齐,那么CPU可能需要访问两次内存才能获得栈内数据。

    sub esp, 10    在栈中分配0x10 bytes,即16字节。程序只会用到4字节空间。但是因为
编译器对栈地址(ESP)进行了16字节对齐,所以每次都会分配16字节的空间。

    leave 指令,等效于“MOV ESP, EBP” 和 “POP EBP” 两条指令。


/*
 * X86-64
 */
    SG2989 db  'hello, world', 00h

    main proc
        sub rsp, 40
        lea rcx, offset flat:SG2989
        call printf
        xor eax, eax
        add rsp, 40
        ret 0
    main endp

    main函数的返回值是整数类型的零,但是出于兼容性和可移植性的考虑,C语言的编译器仍将使用32位的零。换而言之,即使是64位的
    应用程序,在程序结束时EAX的值是零,而RAX的值不一定会是零。

    此时,数据栈的对应空间里仍有40字节的数据。这部分数据空间有个专用的名词,即阴影空间(shadow space)。


/*
 * gcc x86-64
 */
    .string "hello,world\n"
    main:
        sub rsp, 8
        mov edi, offset flat:.LC0    ; hello,world
        xor eax, eax                ; number of vector registers passed
        call printf
        xor eax, eax
        add rsp, 8
        ret

    需要注意的是,64位汇编指令MOV在写放R-寄存器的低32位地址位的时候即对E-寄存器进行写操作的时候,会同时清除R-寄存器中的高32位地址
    位。

/*
 * arm
 */
    main
        stmfd sp!, {r4, lr}
        aor ro, aHellowWorld    ; "hello, world"
        bl _2printf
        mov r0, #0
        ldmfd sp!, {r4, pc}

/*
 * arm 64
 */
    stp x29, x30, [sp, #-16]!
    mov x29, sp
    adrp x0, 40000<_init+0x3b8>
    add x0, x0, #0x648
    bl 40040 <puts@plt>
    mov wo, #0x0
    ldp x29, x30, [sp], #16
    ret

#endif

相关文章:

逆向-beginners之helloworld

#include <stdio.h> int _main() { printf("hello world.\n"); return 0; } // 上面的代码等效于&#xff1a; char *SG3830[] {"hello, world\n"}; int main() { printf("%s", *SG3830); return 0; } #if 0 /* * i…...

如何微调甜甜圈模型——使用示例

Python 中的 Donut 模型可用于从给定图像中提取文本。这在各种场景中都很有用,例如扫描收据。 您可以轻松地。但与人工智能模型一样,您应该根据您的特定需求微调模型。 我编写本教程是因为我没有找到任何资源来准确展示如何使用我的数据集微调 Donut 模型。因此,我必须从其…...

小程序中如何查看指定会员的付款记录

在小程序中&#xff0c;我们可以通过一些简单的步骤来查看指定会员的付款记录。下面是具体的操作流程&#xff1a; 1. 找到指定的会员卡。在管理员后台->会员管理处&#xff0c;找到需要查看付款记录的会员卡。也支持对会员卡按卡号、手机号和等级进行搜索。 2. 查看会员卡…...

LeetCode_贪心算法_困难_630.课程表 III

目录 1.题目2.思路3.代码实现&#xff08;Java&#xff09; 1.题目 这里有 n 门不同的在线课程&#xff0c;按从 1 到 n 编号。给你一个数组 courses &#xff0c;其中 courses[i] [durationi, lastDayi] 表示第 i 门课将会持续上 durationi 天课&#xff0c;并且必须在不晚于…...

Drozer安装

Drozer安装包下载 https://labs.withsecure.com/tools/drozer Drozer需要的python包下载 pip install "pip<21.0" pyOpenSSL pip install "pip<21.0" service_identity pip install "pip<21.0" twisted pip install "pip<…...

752. 打开转盘锁

链接&#xff1a; 752. 打开转盘锁 题解&#xff1a; class Solution { public:int openLock(vector<string>& deadends, string target) {std::unordered_set<std::string> table(deadends.begin(), deadends.end());if (table.find("0000") ! t…...

Bearly:基于人工智能的AI写作文章生成工具

【产品介绍】 名称 Bearly 具体描述 Bearly是一个AI人工智能内容创作工具。你可以用Bearly来阅读、写作、创作&#xff0c;提高你的效率。包括使用Bearly来生成网页的摘要、标题、关键点&#xff0c;也可以用Bearly来生成创意内容、艺术图片、文案编辑等。帮助你克…...

详解哈希,理解及应用

全文目录 概念哈希冲突及原因解决哈希冲突的方法闭散列线性探测二次探测扩容 开散列扩容 哈希的应用位图布隆过滤器 概念 通过映射关系将关键字映射到存储位置&#xff0c;并实现增删改查操作。 通过上面的方法构造出来的结构就叫哈希表&#xff08;散列表&#xff09;&#x…...

解决js加减乘除精度丢失问题

公共类, 将科学计数法的数字转为字符串(以下加减乘除依赖该方法) var toNonExponential (num)> {if(num null) {return num;}if(typeof num "number") {var m num.toExponential().match(/\d(?:\.(\d*))?e([-]\d)/);return num.toFixed(Math.max(0, (m[1] …...

八股——const 关键字

1.const作用 作用&#xff1a;const用于保护指针指向数据不被修改 测试代码1 显示数组的函数不小心修改了指针指向的值&#xff0c;这时候没有加const关键字&#xff0c;编译器不会报错 #include <stdio.h> void showar(int ar[]);int main(void) {int ar[4]{2,3,4,5…...

QT object元对象

qt中的元对象系统提供了对象间通信的信号和槽机制、运行时类型 信息和动态属性系统&#xff1b; 1.该类必须继承自QObject类&#xff1b; 2.必须在类的私有声明区声明Q_OBJECT宏&#xff08;在类定义时&#xff0c;如果没有指定&#xff0c;public或private,则默认为private&a…...

互斥锁,条件变量,信号量的三个小demo

仨demo 一、 一个线程读文件&#xff0c;另一个线程将读取的内容输出到终端 1.1 要求 创建两个线程&#xff0c;其中一个线程读取文件中的数据&#xff0c;另外一个线程将读取到的内容打印到终端上&#xff0c;类似实现cat一个文件。 cat数据完毕后&#xff0c;要结束两个线…...

【UE 材质】力场护盾和冲击波效果

目录 效果 步骤 一、制作力场护盾材质 二、制作冲击波材质效果 三、制作冲击波粒子效果 四、制作震动效果 效果 步骤 一、制作力场护盾材质 1. 首先新建一个第一人称角色游戏模板 2. 新建一个材质&#xff0c;用于作为力场护盾的材质&#xff0c;这里命名为“Mat_for…...

类和对象三大特性之多态

全文目录 虚函数虚函数的重写接口继承和实现继承重载、重写&#xff08;覆盖&#xff09;、隐藏&#xff08;重定义&#xff09;C11 override 和 final抽象类 多态的概念多态原理虚函数表 单继承和多继承的虚函数表打印虚函数表单继承的虚函数表多继承的虚函数表 常见面试问答题…...

为何红黑树在B/B+树之上仍然占据重要地位?

为何红黑树在B/B树之上仍然占据重要地位&#xff1f; 引言二、红黑树和B/B树的基本原理2.1、红黑树的特点和性质2.2、B/B树的特点和性质2.3、红黑树和B/B树的比较 三、B/B树相对于红黑树的优势四、红黑树仍然占据重要地位的原因总结 博主简介 &#x1f4a1;一个热爱分享高性能服…...

【算法专题突破】滑动窗口 - 水果成篮(13)

目录 1. 题目解析 2. 算法原理 3. 代码编写 写在最后&#xff1a; 1. 题目解析 题目链接&#xff1a;904. 水果成篮 - 力扣&#xff08;Leetcode&#xff09; 题目有很长一段话&#xff0c;但是我们读一遍题目可以提炼转化出题目的要求 &#xff1a; 其实就是找出一个最长…...

Peppercontent.io:人工智能驱动的内容生成工具

【产品介绍】​ 名称 Peppercontent.io 成立时间​ 成立于2017年 具体描述 Peppertype.ai 是一种基于GPT-3的AI辅助工具&#xff0c;而GPT-3则是一种深度学习自回归语言模型。这一技术潜藏着巨大的潜力&#xff0c;可以立刻为企业和创作者提供创意内容&…...

docker镜像管理-实操

一.docker镜像管理 1.拉取镜像 docker image pull <repository>:<tag> 镜像名称和标签使用 : 进行分隔&#xff0c;如果省略了标签&#xff0c;则默认为 latest docker image pull nginx:latest 或者docker pull nginx:latest 拉取下来的镜像默认保存在&#xff1…...

SpringMVC-----JSR303以及拦截器

目录 JSR303 什么是JSR303 JSR303的作用 JSR303常用注解 入门使用 拦截器是什么 拦截器的工作原理 拦截器的作用 拦截器的使用 JSR303 什么是JSR303 JSR303是Java为Bean数据合法性校验提供给的标准框架&#xff0c;已经包含在JavaEE6.0中1。 JSR303通过在Bean属性中标…...

基于若依框架实现markdown在线编辑

基于若依框架实现markdown在线编辑 1. 下载mavon-editor npm install mavon-editor --save2. 打开main.js文件, 添加如下 // markdown组件 import { mavonEditor } from "mavon-editor"; import "mavon-editor/dist/css/index.css";// markdown组件 Vue…...

线程同步:确保多线程程序的安全与高效!

全文目录&#xff1a; 开篇语前序前言第一部分&#xff1a;线程同步的概念与问题1.1 线程同步的概念1.2 线程同步的问题1.3 线程同步的解决方案 第二部分&#xff1a;synchronized关键字的使用2.1 使用 synchronized修饰方法2.2 使用 synchronized修饰代码块 第三部分&#xff…...

【SpringBoot】100、SpringBoot中使用自定义注解+AOP实现参数自动解密

在实际项目中,用户注册、登录、修改密码等操作,都涉及到参数传输安全问题。所以我们需要在前端对账户、密码等敏感信息加密传输,在后端接收到数据后能自动解密。 1、引入依赖 <dependency><groupId>org.springframework.boot</groupId><artifactId...

1688商品列表API与其他数据源的对接思路

将1688商品列表API与其他数据源对接时&#xff0c;需结合业务场景设计数据流转链路&#xff0c;重点关注数据格式兼容性、接口调用频率控制及数据一致性维护。以下是具体对接思路及关键技术点&#xff1a; 一、核心对接场景与目标 商品数据同步 场景&#xff1a;将1688商品信息…...

服务器硬防的应用场景都有哪些?

服务器硬防是指一种通过硬件设备层面的安全措施来防御服务器系统受到网络攻击的方式&#xff0c;避免服务器受到各种恶意攻击和网络威胁&#xff0c;那么&#xff0c;服务器硬防通常都会应用在哪些场景当中呢&#xff1f; 硬防服务器中一般会配备入侵检测系统和预防系统&#x…...

学习STC51单片机31(芯片为STC89C52RCRC)OLED显示屏1

每日一言 生活的美好&#xff0c;总是藏在那些你咬牙坚持的日子里。 硬件&#xff1a;OLED 以后要用到OLED的时候找到这个文件 OLED的设备地址 SSD1306"SSD" 是品牌缩写&#xff0c;"1306" 是产品编号。 驱动 OLED 屏幕的 IIC 总线数据传输格式 示意图 …...

安宝特案例丨Vuzix AR智能眼镜集成专业软件,助力卢森堡医院药房转型,赢得辉瑞创新奖

在Vuzix M400 AR智能眼镜的助力下&#xff0c;卢森堡罗伯特舒曼医院&#xff08;the Robert Schuman Hospitals, HRS&#xff09;凭借在无菌制剂生产流程中引入增强现实技术&#xff08;AR&#xff09;创新项目&#xff0c;荣获了2024年6月7日由卢森堡医院药剂师协会&#xff0…...

【C++进阶篇】智能指针

C内存管理终极指南&#xff1a;智能指针从入门到源码剖析 一. 智能指针1.1 auto_ptr1.2 unique_ptr1.3 shared_ptr1.4 make_shared 二. 原理三. shared_ptr循环引用问题三. 线程安全问题四. 内存泄漏4.1 什么是内存泄漏4.2 危害4.3 避免内存泄漏 五. 最后 一. 智能指针 智能指…...

计算机基础知识解析:从应用到架构的全面拆解

目录 前言 1、 计算机的应用领域&#xff1a;无处不在的数字助手 2、 计算机的进化史&#xff1a;从算盘到量子计算 3、计算机的分类&#xff1a;不止 “台式机和笔记本” 4、计算机的组件&#xff1a;硬件与软件的协同 4.1 硬件&#xff1a;五大核心部件 4.2 软件&#…...

比较数据迁移后MySQL数据库和OceanBase数据仓库中的表

设计一个MySQL数据库和OceanBase数据仓库的表数据比较的详细程序流程,两张表是相同的结构,都有整型主键id字段,需要每次从数据库分批取得2000条数据,用于比较,比较操作的同时可以再取2000条数据,等上一次比较完成之后,开始比较,直到比较完所有的数据。比较操作需要比较…...

《Docker》架构

文章目录 架构模式单机架构应用数据分离架构应用服务器集群架构读写分离/主从分离架构冷热分离架构垂直分库架构微服务架构容器编排架构什么是容器&#xff0c;docker&#xff0c;镜像&#xff0c;k8s 架构模式 单机架构 单机架构其实就是应用服务器和单机服务器都部署在同一…...