首页 > TAG信息列表 > rbp
math.h -lm随记(一)
最近可能随手会记很多C/C++语法相关的东西,都是随手记的,如果后续有空可能会整理成文章。 1.关于gcc的lm编译选项: 观察易知,像stdio.h,stdlib.h或者math.h之类的头文件,包含的都是函数的声明而非定义。(关于声明和定义,详见之前《浅谈指针》的文章系列)而真正的函数定义,都是包含在库中的。从C过渡到C++——换一个视角深入数组[真的存在高效吗?](2)
从C过渡到C++——换一个视角深入数组[真的存在高效吗?](2) C风格高效的数组遍历 在过渡到C++之前我还是想谈一谈如何书写高效的C的代码,这里的高效指的是C代码的高效,也就是在不开启编译器优化下,C层级的自由化,编译器优化固然很好,但是源代码的高效远远要胜于编译器的优化,因为在大多数情X86汇编层面的方法调用。
本文主要描述了X64下的汇编层面的方法调用。具体来说就是一个C语言的方法被另外一个方法调用,是如果在汇编语言X64的规范中实现的。 1.假设有如下C语言文件 "test.c" 点击查看代码 int sumNine(int one, int two, int three, int four, int five, int six, int seven,DASCTF2022七月赋能赛 eyfor
checksec Arch: amd64-64-little RELRO: Partial RELRO Stack: No canary found NX: NX enabled PIE: No PIE (0x400000) File pwn4: ELF 64-bit LSB executable, x86-64, version 1 (SYSV), dynamically linked, interpreter /lib64/ld-linux-x86-64.sC++中类的成员函数是如何调用this指针
C++中类的成员函数是如何调用this指针 起因 最近工作中遇到一个有趣的闪退问题,原因很简单,就是因为调用了一个空对象的成员函数。但是在dump的堆栈信息里发现程序终止的地方并不是函数刚开始,而是在函数内部执行很多语句后才终止,类似于: class Example { // 不重要的乱七八糟 voidstanford cs110l lec1
1.1 gets函数与栈帧 gets函数不安全 启动gdb rip寄存器存放的是下一条指令要执行的地址,rbp寄存中.Net GC 结构体GCInfo剖析,
前言: dotnet已经发展到了 preview 7的版本,这个GC回收的文章或者视频非常少,几乎没有看到,有个别的也是模糊不清或者三言两语,或者太过于笼统,或者作者自己都没搞明白为啥是这样。至于深入到GC里面的GCinfo结构体就更少见了。因为这个结构体里面包含了根对象所在的地址,对于垃圾回收的第BUUCTF_N1book_RE_[第五章 CTF之RE章]BabyAlgorithm
64位,无壳 主函数: __int64 __fastcall main(int a1, char **a2, char **a3) { __int64 result; // rax int i; // [rsp+Ch] [rbp-E4h] char v5[16]; // [rsp+10h] [rbp-E0h] BYREF char s[64]; // [rsp+20h] [rbp-D0h] BYREF char v7[64]; // [rsp+60h] [rbp-90h] BYR[TSCTF 2022] Reverse赛题复现
再不学逆向真要被开了 还是太菜了,T2 T3要么就是找到了加密方法但是不知道怎么把代码逻辑联系起来,要么就是对应的密文找不到,还得加把劲学习啊。。 happy_mota 赛中直接玩游戏玩到底玩出来的,现在试试逆向方法。 把exe解包后得到两个重要文件:main.py和scripts文件夹。scripts文件夹内一次int转换成unsigned long数值溢出问题
在项目中遇到一个奇怪的宕机问题,后来查询定位发现是erlang底层数据溢出问题,用c模拟情况类似,当一个int类型的x值大于等于1<<25的时候,再左移6位会造成nt溢出,然后再强转成64位无符号整数。 test_int.c #include <stdio.h> int main(){ int a = 1; int x = (a<<25); intCTFSHOW-Reverse-刷题记录
re2 打开初步分析为32位程序,无壳,拖入IDA32分析 找到关键行47-50,分析得出各函数内部的基本作用如图所示 首先进入分析输入后的处理 可以很明显看出,是对输入的字符串进行处理后再操作,因此根据这个思路写出脚本,得到这里的密钥 #!/usr/bin/python #coding=utf-8 user = "DH~mqqvqxB^C++虚函数调用简单分析
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;c语言中inline函数的作用
记录一下inline函数的作用 普通函数的调用过程 在eclipse里面创建工程,代码如下: #include <iostream> #include <vector> #include <cstring> #include <cassert> #include <algorithm> using namespace std; //__attribute__((always_inline)) inline int test(int x) intBUUCTF_Re_SimpleRev
主函数: unsigned __int64 Decry() { char v1; // [rsp+Fh] [rbp-51h] int v2; // [rsp+10h] [rbp-50h] int v3; // [rsp+14h] [rbp-4Ch] int i; // [rsp+18h] [rbp-48h] int v5; // [rsp+1Ch] [rbp-44h] char src[8]; // [rsp+20h] [rbp-40h] BYREF __int64 v7;攻防世界—RE—新手区—logmein
exeinfo分析,64位, main函数: void __fastcall __noreturn main(int a1, char **a2, char **a3) { size_t v3; // rsi int i; // [rsp+3Ch] [rbp-54h] char s[36]; // [rsp+40h] [rbp-50h] BYREF int v6; // [rsp+64h] [rbp-2Ch] __int64 v7; // [rsp+68h] [rbp-28h]ROP-ret2csu
ret2csu原理 利用ret2csu的方法实现ROP。 __libc_csu_init proc near ; DATA XREF: _start+16↑o .text:0000000000400840 ; __unwind { .text:0000000000400840 push r15 .text:0000000000400842 push r14 .text:0000000000Linux: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-fwp【图文】函数调用过程中栈的变化
大家都知道函数调用是通过栈来实现的,而且知道在栈中存放着该函数的局部变量。但是对于栈的实现细节可能不一定清楚。本文将介绍一下在Linux平台下函数栈是如何实现的。 栈帧的结构 函数在调用的时候都是在栈空间上开辟一段空间以供函数使用,所以,我们先来了解一下通用栈帧的结构。图解CPU执行一段程序
程序执行 从打印出 Hello World 开始,程序如何运行起来,大家都很清楚。那么底层如何执行的呢,让我们一探究竟。 long main(){ long a = 1; long b = 2; return a + b; } 来一段 C 语言作为例子, gcc -S 生成汇编代码,简化如下。 pushq %rbp movq %rsp, %rbp movq $1, -82.4 OpenEuler中C语言中的函数调用测试
2.4 OpenEuler中C语言中的函数调用测试 任务详情 在X86_64架构下实践2.4中的内容 通过GDB查看寄存器的内容,把教材中的图填入具体的值 把2.4的C代码在OpenEuler中重新实践一遍,绘制出ARM64的逻辑框图 任务一X86_64架构下实践2.4 操作环境: Ubuntu Kylin 2.4.1 code #include <stdiPWN保护机制详解
对pwn过程中遇到的保护机制做一下详解与归纳。 Stack Canaries 放一篇写的好的:PWN之Canary学习 - sarace - 博客园 (cnblogs.com) 简介 stack canaries取名自地下煤矿的金丝雀,能比矿工更快发现煤气泄露,有预警的作用。这个概念应用在栈保护上则是在初始化一个栈帧时在栈底设置一调用栈被破坏的手动恢复
函数调用前言后序 一般来说,在未优化的情况下,函数的调用栈的前言和后续对应的指令都是固定的。 push %rbp mov %rsp,%rbp sub $10,%rsp #这里的立即数 10 表示函数需要的栈大小,与函数自身小关 leave # leave 等价于以下两条指令 #mov %rbp,%rsp #pop %rbp ret push %rbp 之汇编看指针
前言 开发中经常使用指针访问变量修改变量值, 那么编译器是怎么翻译指针的 或者说指针在汇编层面到底是什么 mov 和 lea 指令 指针的分析离不开这两个指令,简单看下mov指令 mov指令 GNU汇编器输出AT&T汇编时为 mov 指令添加了一个维度,在其中必须声明要传送的数据元素的长度 因CSAPP第4章家庭作业参考答案
4.45 不正确 push %rsp的指令会将rsp减8之前的old value压栈 应该是如下代码: movq REG, -8(%rsp) sub $8, %rsp 4.46 不正确 应该改为 add $8, %rsp movq -8(%rsp), REG 4.47 #include<stdio.h> long int a[100] = {3, 1, 4, 1, 5, 9, 2, 6, 5, 3}; void bubble_b(long *datC&Golang函数调用过程详解(二)
上篇文章聊到在main中执行了调用sum函数的call指令。 这时CPU跳到sum开始执行如下命令: 0x0000000000400526 <+0>:push %rbp 0x0000000000400527 <+1>:mov %rsp,%rbp 0x000000000040052a <+4>:mov %edi,-0x14(%rbp) 0x000000000040052d <+7>:mov %esi,-0x18(%r