首页 > TAG信息列表 > Rax
《高级C/C++编译技术》01
Linux程序内存布局: 启动程序的默认加载点是在链接阶段才添加的,通常放在程序内存映射的起始处(这是可执行文件和动态库之间的唯一区别)。启动代码有两种不同方式: crt0:“纯粹”的入口点,这是程序代码的第一部分,在内核控制下执行 crt1:更现代化的启动例程,可以在main函数执行前和程序终2022CISCN-satool
2022CISCN-satool 打国赛的时候自己还并不了解LLVM PASS pwn,前几天正好学习了一下LLVM PASS pwn,于是就顺便来复现一下这道题目。 首先找到二进制文件的重写函数的主体并对其进行分析。 开始就是限制了函数的参数和基本块的个数必须为1。 然后是先把一块区域变成可写可执行,并通过x86_64汇编基础:Basics
参考 https://cs61.seas.harvard.edu/site/2018/Asm1/ 正文 Registers Registers are the fastest kind of memory available in the machine. x86-64 has 14 general-purpose registers and several special-purpose registers. This table gives all the basic registers, witSDCTF 2022 Oil Spill
checksec Arch: amd64-64-little RELRO: No RELRO Stack: Canary found NX: NX enabled PIE: No PIE (0x400000) 开启了Canary和堆栈不可执行 main push rbp .text:000000000040068B mov rbp,ctf pwn题patch方法(UAF)
ctf pwn题patch方法(UAF) 以ciscn2022华东南赛区一题为例,附件在文章末尾 漏洞在sub_1614函数,free之后指针没有置零 patch步骤如下: 修改.eh_frame section所在segment权限,使patch代码可以执行 View->Open subviews->Segments查看.eh_frame section的地址,可以看到是0x1e00-0x2208021 指针思考
/* 目录: 一 C原理 二 汇编原理 */ 一 C原理 void change(int** p2) { printf("p2 = 0x%x, *p2 = 0x%x\n", p2, *p2); printf("*p2 = 0x%x, *8p2 = %d\n", *p2, **p2); } int main() { int i = 3; printf("&i = 0x%x, i = %dcpp拾遗——类
1. 继承和访问控制 1.1 访问控制的管道 public成员 protected成员 private成员 public继承 public , public = 子类内外皆可访问 protected , public = 只能子类内和父类内访问 private , public = 只能父类内访问 protected继承 public , protected = protected protecx64 ShellCode 弹出计算器
Main.cpp extern "C" void PopCalculator(); extern "C" void _INT3(); int main() { _INT3(); PopCalculator(); return 0; } Code.asm PopCalculator proto _INT3 proto ; Hash: ; ; WinExec : 0x1A22F51 ; LoadLibrary : 0x0C9174C++虚函数调用简单分析
C++代码如下: class parent_parent { public: virtual int print() const { return 1; } }; class sub : public parent_parent { public: int print() const override { return 0; } }; int main() { parent_parent* p = new sub;《深入理解计算机系统》——如何分析汇编指令
汇编指令的相关基础知识 文章目录 汇编指令的相关基础知识前言一、寄存器种类及其功能二、常用汇编指令解析1.mov指令2.add指令3.sub指令4.push指令5.pop指令6.jmp指令7.call指令8.ret指令9.cmp指令10.jg指令 三、寻址方式1.立即数寻址2.直接寻址3.间接寻址4.变址寻址5.BIS第63篇-解释器与编译器适配(二)
这一篇详细介绍相关适配器的代码片段。 1、解释执行切换到编译执行的例程 调用SharedRuntime::gen_i2c_adapter()函数生成解释执行切换到编译执行的例程,如下: 注意生成的汇编代码会以函数传入的实参的不同而不同,例如传入的实参是2时的汇编如下: 0x00007fffe110a1a0: mov (%rsp),Akaban操作系统(4)-----中断控制器的初始化,来自UHCI的中断
相信你一定读了我的上一篇文章(总之应该只有IO APIC才能接受来自PCI的中断),没错,只要这次将中断驱动写出来就可以正式开始PCI的开发了! APIC相对于8259A中断处理器那性能可谓是差了十万八千里,先不对比实际性能,先说说它们诞生的年代 8259A: 是为8085A和8086/8088这类16位,寻址能力只有Redis之Rax
Rax全称redis tree,是一个有序字典树,可以根据key进行排序,支持快速定位、插入与删除,与hash/zset不同在于hash不具备排序功能,zset则根据score进行排序。【trie简介】在计算机科学中,trie,又称前缀树或字典树,是一种有序树,用于保存关联数组,其中的键通常是字符串。与二叉查找树不同,键不是第57篇-profile实例
之前已经介绍过回边计数和ProfileData与Layout,下面举个具体的例子看下MethodData是怎么利用ProfileData等记录详细的运行时信息的。实例如下: package com.test; import java.util.LinkedList; public class CompilationDemo { public static void main(String args[]){ fact第55篇-回边计数
在前面介绍控制转移指令时只简单介绍了相关字节码解释执行的主要逻辑,没有介绍过统计相关的逻辑。对于控制转移指令来说,通常会调用TemplateTable::branch(bool is_jsr, bool is_wide)函数生成相关的汇编代码,这些汇编代码会含有统计的逻辑,这一篇将详细介绍。 控制转移指令中,大部分都深入分析redis之rax底层原理,前缀树?
文章目录 前言一、Radix Tree 是什么?二、Radix Tree 数据结构1. 结构2. 非压缩节点3. 压缩节点4. 图解Radix Tree 三、基本操作1. 查询2. 插入3. 删除4. 遍历 总结 前言 本文参考源码版本为 redis6.2 前缀树是字符串查找时,经常使用的一种数据结构,能够在一个字符串集合中Windows下64位程序的Inline Hook
有过32位hook的介绍,代码不是主要的,所以贴在最后,首先记述下原理。 主体代码还是参考与那本关于黑客技术的书,部分内容则参考自以下博客。 https://blog.csdn.net/zuishikonghuan/article/details/47979603 原理:mov rax,地址 push rax ret 64位程序中,jmp 貌似也只能跳转4字节的lldb常用指令
//读取寄存器的值 pregister read/格式 pregister read/x //修改寄存器的值 pregister write 寄存器名称 数值 pregister write rax 0 //读取内存中的值 px/数量-格式-字节大小 内存地址 px/3xw 0x0000010 //修改内存中的值 pmemory write 内存地址 数值 pmemory write 0xLinux:ftrace: 为什么有些函数没有在available_filter_functions
文章目录 例如:__run_hrtimer汇编 例如:__run_hrtimer 这个函数其实有被用到,在函数__hrtimer_run_queues 中,有调用__run_hrtimer 但是在available_filter_functions 文件中就是没有 <sbc2048-fwp-a:root>/sys/kernel/debug/tracing: # grep __run_hrtimer av* <sbc2048-fwpBUUCTF [极客大挑战 2019]Not Bad
总的来说这是一个64位orw的题 开头先在主函数里分配了一个很大的空间 1 __int64 __fastcall main(int a1, char **a2, char **a3) 2 { 3 mmap((void *)0x123000, 0x1000uLL, 6, 34, -1, 0LL); 4 sub_400949(); 5 sub_400906(); 6 sub_400A16(); 7 return 0LL; 8 }程序的机器级表示(二)
注:以下所有内容均来自开源学习组织DataWhale 程序的机器级表示(二) 1 加载有效地址 **leaq S, D → \rightarrow → Load Effective Address ** 注:x86-64位处理器地址长度都是64,因此都是lea图解CPU执行一段程序
程序执行 从打印出 Hello World 开始,程序如何运行起来,大家都很清楚。那么底层如何执行的呢,让我们一探究竟。 long main(){ long a = 1; long b = 2; return a + b; } 来一段 C 语言作为例子, gcc -S 生成汇编代码,简化如下。 pushq %rbp movq %rsp, %rbp movq $1, -8c语言if语句是如何变成汇编代码的?
1. 要编译的测试代码: int a; int b = 3; int main(void) { if (3) a = 4; else b = 5; } 2. 词法分析 词法分析将c源代码解析成一个个的token。 关键的,将if两个字符解析成一个if token,后续语法分析的输入就从两个字符减少为1个token,减小汇编看指针
前言 开发中经常使用指针访问变量修改变量值, 那么编译器是怎么翻译指针的 或者说指针在汇编层面到底是什么 mov 和 lea 指令 指针的分析离不开这两个指令,简单看下mov指令 mov指令 GNU汇编器输出AT&T汇编时为 mov 指令添加了一个维度,在其中必须声明要传送的数据元素的长度 因【C/C++】关于移位操作的一些自学小结
1、常见的左移右移,以无符号整型为例 可以看到,打印16进制的x值,只有15个f,说明右移4位没问题,高位正常补0。左移同理。 其中show方法参考《深入理解计算机系统(第三版)》写的函数,打印目标地址的字节。(我是小端,所以最低有效字节0xff在最前面打印,最高位的0x0f在最后打印。) 同理,