逆向-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; } // 上面的代码等效于: char *SG3830[] {"hello, world\n"}; int main() { printf("%s", *SG3830); return 0; } #if 0 /* * i…...
如何微调甜甜圈模型——使用示例
Python 中的 Donut 模型可用于从给定图像中提取文本。这在各种场景中都很有用,例如扫描收据。 您可以轻松地。但与人工智能模型一样,您应该根据您的特定需求微调模型。 我编写本教程是因为我没有找到任何资源来准确展示如何使用我的数据集微调 Donut 模型。因此,我必须从其…...
小程序中如何查看指定会员的付款记录
在小程序中,我们可以通过一些简单的步骤来查看指定会员的付款记录。下面是具体的操作流程: 1. 找到指定的会员卡。在管理员后台->会员管理处,找到需要查看付款记录的会员卡。也支持对会员卡按卡号、手机号和等级进行搜索。 2. 查看会员卡…...
LeetCode_贪心算法_困难_630.课程表 III
目录 1.题目2.思路3.代码实现(Java) 1.题目 这里有 n 门不同的在线课程,按从 1 到 n 编号。给你一个数组 courses ,其中 courses[i] [durationi, lastDayi] 表示第 i 门课将会持续上 durationi 天课,并且必须在不晚于…...
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. 打开转盘锁
链接: 752. 打开转盘锁 题解: 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来阅读、写作、创作,提高你的效率。包括使用Bearly来生成网页的摘要、标题、关键点,也可以用Bearly来生成创意内容、艺术图片、文案编辑等。帮助你克…...
详解哈希,理解及应用
全文目录 概念哈希冲突及原因解决哈希冲突的方法闭散列线性探测二次探测扩容 开散列扩容 哈希的应用位图布隆过滤器 概念 通过映射关系将关键字映射到存储位置,并实现增删改查操作。 通过上面的方法构造出来的结构就叫哈希表(散列表)&#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作用 作用:const用于保护指针指向数据不被修改 测试代码1 显示数组的函数不小心修改了指针指向的值,这时候没有加const关键字,编译器不会报错 #include <stdio.h> void showar(int ar[]);int main(void) {int ar[4]{2,3,4,5…...
QT object元对象
qt中的元对象系统提供了对象间通信的信号和槽机制、运行时类型 信息和动态属性系统; 1.该类必须继承自QObject类; 2.必须在类的私有声明区声明Q_OBJECT宏(在类定义时,如果没有指定,public或private,则默认为private&a…...
互斥锁,条件变量,信号量的三个小demo
仨demo 一、 一个线程读文件,另一个线程将读取的内容输出到终端 1.1 要求 创建两个线程,其中一个线程读取文件中的数据,另外一个线程将读取到的内容打印到终端上,类似实现cat一个文件。 cat数据完毕后,要结束两个线…...
【UE 材质】力场护盾和冲击波效果
目录 效果 步骤 一、制作力场护盾材质 二、制作冲击波材质效果 三、制作冲击波粒子效果 四、制作震动效果 效果 步骤 一、制作力场护盾材质 1. 首先新建一个第一人称角色游戏模板 2. 新建一个材质,用于作为力场护盾的材质,这里命名为“Mat_for…...
类和对象三大特性之多态
全文目录 虚函数虚函数的重写接口继承和实现继承重载、重写(覆盖)、隐藏(重定义)C11 override 和 final抽象类 多态的概念多态原理虚函数表 单继承和多继承的虚函数表打印虚函数表单继承的虚函数表多继承的虚函数表 常见面试问答题…...
为何红黑树在B/B+树之上仍然占据重要地位?
为何红黑树在B/B树之上仍然占据重要地位? 引言二、红黑树和B/B树的基本原理2.1、红黑树的特点和性质2.2、B/B树的特点和性质2.3、红黑树和B/B树的比较 三、B/B树相对于红黑树的优势四、红黑树仍然占据重要地位的原因总结 博主简介 💡一个热爱分享高性能服…...
【算法专题突破】滑动窗口 - 水果成篮(13)
目录 1. 题目解析 2. 算法原理 3. 代码编写 写在最后: 1. 题目解析 题目链接:904. 水果成篮 - 力扣(Leetcode) 题目有很长一段话,但是我们读一遍题目可以提炼转化出题目的要求 : 其实就是找出一个最长…...
Peppercontent.io:人工智能驱动的内容生成工具
【产品介绍】 名称 Peppercontent.io 成立时间 成立于2017年 具体描述 Peppertype.ai 是一种基于GPT-3的AI辅助工具,而GPT-3则是一种深度学习自回归语言模型。这一技术潜藏着巨大的潜力,可以立刻为企业和创作者提供创意内容&…...
docker镜像管理-实操
一.docker镜像管理 1.拉取镜像 docker image pull <repository>:<tag> 镜像名称和标签使用 : 进行分隔,如果省略了标签,则默认为 latest docker image pull nginx:latest 或者docker pull nginx:latest 拉取下来的镜像默认保存在࿱…...
SpringMVC-----JSR303以及拦截器
目录 JSR303 什么是JSR303 JSR303的作用 JSR303常用注解 入门使用 拦截器是什么 拦截器的工作原理 拦截器的作用 拦截器的使用 JSR303 什么是JSR303 JSR303是Java为Bean数据合法性校验提供给的标准框架,已经包含在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…...
5分钟解决经典游戏兼容性问题:DDrawCompat完整使用指南
5分钟解决经典游戏兼容性问题:DDrawCompat完整使用指南 【免费下载链接】DDrawCompat DirectDraw and Direct3D 1-7 compatibility, performance and visual enhancements for Windows Vista, 7, 8, 10 and 11 项目地址: https://gitcode.com/gh_mirrors/dd/DDraw…...
ESP32 IDF环境下DHT11温湿度读取避坑指南:从时序图到数据拼接的完整解析
ESP32 IDF环境下DHT11温湿度读取避坑指南:从时序图到数据拼接的完整解析 在物联网设备开发中,温湿度传感器是最基础也最常用的环境感知元件之一。DHT11作为一款低成本、单总线数字输出的温湿度传感器,被广泛应用于各类嵌入式项目中。然而&…...
ollama-QwQ-32B量化部署:在4GB内存设备运行OpenClaw的配置
ollama-QwQ-32B量化部署:在4GB内存设备运行OpenClaw的配置 1. 为什么要在低配设备上折腾大模型? 去年冬天,我在树莓派上第一次尝试部署OpenClaw时,被现实狠狠教育了一顿——32GB内存的笔记本跑得飞起,换到4GB的树莓派…...
SAM3图片分割模型入门:无需训练,输入提示词即可提取物体掩码
SAM3图片分割模型入门:无需训练,输入提示词即可提取物体掩码 1. 什么是SAM3图片分割模型 SAM3(Segment Anything Model 3)是2025年发布的一款革命性图像分割模型,它彻底改变了传统需要大量标注数据训练的模式。这个模…...
【ybtoj】【KMP】【例题1】子串查找
【例题1】子串查找Link解题思路CodeLink 传送门 题目 解题思路 kmp模板题 找了超级多篇KMP的博客,一直都看不懂 直到……直到我找到了光(bushi) 这篇博客直接把我升华 Code #include <iostream> #include <cstring> #include…...
全球协作的终极指南:Open Library多语言团队开发与维护的最佳实践
全球协作的终极指南:Open Library多语言团队开发与维护的最佳实践 【免费下载链接】openlibrary One webpage for every book ever published! 项目地址: https://gitcode.com/gh_mirrors/op/openlibrary Open Library是一个致力于为每一本已出版书籍创建网页…...
OpenClaw备份恢复指南:ollama-QwQ-32B模型与技能迁移方案
OpenClaw备份恢复指南:ollama-QwQ-32B模型与技能迁移方案 1. 为什么需要备份恢复方案 上周我的主力开发机突然硬盘故障,导致整个OpenClaw环境丢失。最痛苦的不是重装软件,而是那些精心调教过的技能配置和任务历史记录全部归零。这次经历让我…...
3步实现文件安全验证:HashCheck实战指南
3步实现文件安全验证:HashCheck实战指南 【免费下载链接】HashCheck HashCheck Shell Extension for Windows with added SHA2, SHA3, and multithreading; originally from code.kliu.org 项目地址: https://gitcode.com/gh_mirrors/ha/HashCheck 在数字化办…...
如何快速学习Web安全:DVWA-Chinese完整教程指南
如何快速学习Web安全:DVWA-Chinese完整教程指南 【免费下载链接】DVWA-Chinese DVWA全汉化版本 项目地址: https://gitcode.com/gh_mirrors/dv/DVWA-Chinese 想要在安全领域快速成长?DVWA-Chinese就是你的最佳Web安全测试平台!作为全球…...
手把手教你用Matlab/Simulink搭建VSG虚拟阻抗模型,搞定新能源并网振荡难题
新能源并网VSG虚拟阻抗控制实战:从Simulink建模到振荡抑制 电力电子工程师们正面临一个棘手难题——新能源并网系统中的宽频振荡。当构网型变流器(GFM)在强电网环境下运行时,次同步和超同步频段的负阻尼特性可能导致系统失稳。虚拟…...
