- 博客(43)
- 收藏
- 关注
原创 栈迁移与栈劫持技术详解
栈迁移适用场景:溢出空间不足,但能控制RBP或RSP。核心步骤覆盖返回地址为leave;ret。将栈迁移到可控区域(如.bss段)。在新栈部署ROP链或Shellcode。时光匆匆,一篇博客又到了结尾处啦。
2025-02-13 21:58:46
440
原创 格式化字符串漏洞详解(附BUUCTF习题)
格式化字符串漏洞(Format String Vulnerability)是由于程序使用用户可控的输入作为格式化字符串参数(如 、 等函数)时未正确过滤导致的漏洞。攻击者可通过构造特殊格式字符串实现以下操作:内存泄露:读取栈或堆中的敏感数据(如密码、密钥)。内存覆盖:向任意地址写入数据(如劫持控制流、覆盖函数指针)。程序崩溃:通过非法内存访问导致拒绝服务(DoS)。关键机制:信息泄露(Memory Leak)目标:读取栈或堆中的敏感数据(如 或 地址)。示例: → 用户输入 泄露栈内容。覆盖关键变量目
2025-02-12 22:09:00
1008
1
原创 ret2text、ret2syscall、ret2shellcode 详解
攻击类型核心思路依赖条件ret2text跳转到程序已有的代码片段存在可利用函数构造 ROP 链触发系统调用足够的 Gadgets向可执行内存写入并执行 Shellcode内存可写且可执行(NX关闭)根据题目环境和保护机制选择合适的方法,结合调试工具动态验证。时光匆匆,一篇博客又到了结尾处啦。
2025-02-11 20:49:30
845
原创 ret2libc 题型详解
ret2libc的核心是复用已有代码(如system)绕过 NX。PLT/GOT是动态链接的关键机制,PLT 用于跳转,GOT 存储真实地址。攻击需结合栈溢出、ROP 链构造和 libc 基址计算。工具推荐ROPgadget:查找 gadget。pwntools:动态构造 payload。:根据泄漏地址查找 libc 版本。时光匆匆,一篇博客又到了结尾处啦。
2025-02-10 13:30:25
528
原创 格式化字符串漏洞(Format String Vulnerability)
格式化字符串漏洞(Format String Vulnerability)是程序中因不当处理格式化字符串参数而导致的一类安全漏洞,常被攻击者利用来读取内存数据、篡改程序执行流程,甚至执行任意代码。
2025-02-09 20:08:55
628
原创 关于32位和64位程序的传参方法及虚拟机调试工具总结
调用者负责清理栈空间(如。需预留32字节"影子空间"(Shadow Space):前6个参数通过寄存器传递,后续参数压栈。在关键函数/系统调用处设置断点。调用时需对齐栈到16字节边界。修改寄存器值测试漏洞利用(如。结合反汇编分析参数传递路径。单步跟踪观察寄存器变化。
2025-02-08 23:06:03
523
原创 Linux 命令行指南
管道:将前一个命令的输出作为后一个命令的输入。:命令操作的目标(如文件名、路径)。:普通用户可能无法修改系统目录(如。:查看磁盘空间(人类可读格式):创建空文件或更新文件时间戳。:退出终端后仍保持程序运行。查看历史命令,或使用。:输入命令或路径时按。:递归强制删除不可逆!:避免误操作系统文件。
2025-02-07 20:07:28
913
原创 深入了解 MySQL:从基础到高级特性
在当今数字化时代,数据的存储和管理至关重要。MySQL 作为一款广泛使用的开源关系型数据库管理系统(RDBMS),凭借其高性能、可靠性和易用性,成为众多开发者和企业的首选。本文将详细介绍 MySQL 的基础概念、安装启动、基本操作命令以及高级特性,并给出丰富的命令示例,帮助你全面掌握 MySQL 的使用。
2025-02-06 18:19:35
2313
原创 pwn环境搭建手册(步骤清晰且附带详细命令)
以下是为零基础小白准备的推荐(长期支持版),适合新手且兼容性强。虚拟机(VMware/VirtualBox)或物理机安装。(示例程序test.c(入门神站)(赛事题目存档)创建exp.py。
2025-02-04 17:22:00
757
原创 GDB 使用指南(涵盖从基础到进阶的常用命令和技巧)
编译选项禁用优化,或在 GDB 中使用。确保代码路径与实际运行的程序一致。检查程序是否编译时包含调试信息(break <位置>print <变量>
2025-02-03 20:08:59
683
原创 IDA Pro的基础指南
在网络安全和软件分析领域,逆向工程是理解程序行为、挖掘漏洞或分析恶意软件的核心技能之一。而(Interactive Disassembler)作为逆向工程的“瑞士军刀”,是每位安全研究员和分析师的必备工具。本文将带你从零开始,逐步掌握IDA的基础操作和核心功能,助你开启逆向工程的大门。
2025-02-03 11:04:05
1540
原创 Windows 快捷键与命令全解
显示磁盘目录命令,格式为dir [盘符] [路径] [文件名] [/p][/w] [/A] [i] 属性。:进行网络诊断,并且列出分组经过的路由节点,以及它在 ip 网络中每一跳的延迟,排查网络故障。:用于检测网络的连通性、可到达性和域名解析的 TCP/IP 命令,判断网络是否正常。:删除一个目录,命令格式为rd [/s] [/q] [drive:] path。:显示当前目录,命令格式为cd [/d] [drive:] {path}。:将一个或多个文件从一个目录移动到指定的目录,实现文件的移动。
2025-02-02 13:49:54
953
原创 linux常用命令大全
ls ——显示当前目录下的所有文件mkdir ——创建目录cd ——切换目录touch ——创建文件cp ——复制文件mv ——剪切文件pwd ——显示当前目录rm ——删除文件cat——显示文件内容tac 逆序显示文件内容more ——显示文件内容less ——显示文件内容head ——显示文件头几行tail ——显示文件尾几行。
2025-01-31 18:00:22
709
原创 Pwn 入门核心工具和命令大全
启动调试:gdb ./binary运行程序:run 或 r设置断点:break *0x地址 或 b 函数名查看寄存器:info registers查看内存:x/10wx 0x地址 (查看 10 个 4 字节的十六进制值)反汇编:disassemble 函数名 或 disas单步执行:ni(汇编级单步) / si(进入函数调用)查看堆栈:x/20wx $sp。
2025-01-30 21:28:23
1268
原创 《深入解析指针相关知识》
int arr[5];这是最基础的整型数组定义,表示定义了一个包含 5 个整型元素的数组,在内存中会连续分配相应的空间来存储这些整型数据。属于整型指针数组,它创建了一个能存放 10 个整型指针的数组,可用于管理多个不同的整型数据地址,方便对多个整型变量或者整型数组元素等进行间接访问和操作。是数组指针,其作用是指向一个大小为 10 个整型元素的数组,在涉及对特定大小整型数组的操作以及传递数组地址等场景中有着重要用途,能让我们更精准地操控数组相关的内存区域。
2025-01-05 07:41:29
734
原创 深度剖析数据在内存中的存储
基本的内置类型:char//字符数据类型short//短整型int//整型long//长整型long long//更长的整型float//单精度浮点数double//双精度浮点数//C语言有没有字符串类型?以及他们所占空间的大小。1.使用这个类型开辟内存空间的大小(大小决定了使用范围)。2.如何看待内存空间的视角。什么大端小端:大端(存储)模式,是指数据的低位保存在内存的高地址中,而数据的高位保存在内存的低地址中;
2025-01-01 20:13:33
1036
原创 实用调试技巧
第一次被发现的导致计算机错误的飞蛾,也是第一个计算机程序错误。Debug通常称为调试版本,他包含调试信息,并且不作任何优化,便于程序员调试程序。Release称为发布版本,它往往是进行了各种优化,使得程序在代码大小和运行速度上都是最优的,以便用户很好的使用。上述代码在Debug环境的结果展示:上述代码在Release中环境的结果展示:Debug和Release反汇编展示对比:所以我们说调试就是在Debug版本的环境中,找代码中潜伏的问题的一个过程。
2024-12-29 00:16:39
1016
原创 深入理解结构体:从声明到传参
有了结构体类型,那如何定义变量,其实很简单。int x;int y;}p1;//声明类型的同时定义变量p1//定义结构体变量p2//初始化:定于变量的同时赋初值struct Stu //类型声明//名字int age;//年龄//初始化int date;//结构体嵌套初始化//结构体嵌套初始化。
2024-12-26 17:25:13
574
原创 指针(初阶)
指针就是地址,口语中说的指针通常指的是指针变量。那我们可以这样理解:内存指针变量我们可以通过&(取地址操作符)取出变量的内存起始地址,把地址可以存放到一个变量中,这个变量就是指针变量。
2024-12-25 16:50:50
897
原创 操作符详解
逻辑反操作负值正值取地址sizeof操作数的类型长度(以字节为单位)对一个数的二进制按位取反--前置、后置--++前置、后置++间接访问操作符(解引用操作符)(类型)强制类型转换int main()2);//00);//1a = -a;p = &a;//4//4//这样写行不行?ok//这样写行不行?
2024-12-23 10:49:53
1087
原创 扫雷游戏(基础版)
中对应位置为相应的数字字符,然后重新显示棋盘,循环继续,直到找到的非雷个数达到总格子数减去雷的数量(即所有非雷格子都被排查完),此时游戏胜利,显示雷的棋盘并提示排雷成功。则是在原棋盘行数和列数基础上各加 2,用于在棋盘周边扩充一圈,方便后续判断某个格子周围雷的数量等操作,避免边界判断的复杂情况。循环不断让玩家输入要排查的坐标,先判断输入坐标是否合法(在棋盘范围内),接着检查该坐标对应的格子在显示棋盘。的 ASCII 值是连续的,相减后可以得到对应的整数值),从而得到周围雷的实际数量。
2024-12-20 20:00:04
1327
3
原创 三子棋游戏(基础版)
它通过两层循环来实现,外层循环控制行数,内层循环在每行中先打印出每个格子对应的字符(棋子符号或者空白),并且在格子之间用。在检查行时,通过外层循环遍历每一行,然后比较该行的三个格子的棋子是否相同且不为空白,如果满足条件,就返回该行棋子对应的字符(之间),二是检查输入坐标对应的格子是否为空(没有被其他棋子占据),只有当坐标合法且对应格子为空时,才会将玩家的棋子(用。(即空白),就返回 0,表示棋盘未满;范围内的随机数作为棋盘的行列索引),接着检查该随机坐标对应的格子是否为空,如果为空,就将电脑的棋子(用。
2024-12-19 10:39:11
508
原创 C语言——数组_数组名
往往我们在写代码的时候,会将数组作为参数传个函数,比如:我要实现一个冒泡排序(这里要讲算法思想)函数将一个整形数组排序。1.sizeof(数组名),计算整个数组的大小,sizeof 内部单独放一个数组名,数组名表示整个数组。方法1,出问题,那我们找一下问题,调试之后可以看到bubble_sort函数内部的sz,是1。2.&整数名,取出的是数组的地址。除此1,2两种情况之外,所有的数组名都表示数组首元素的地址。当数组传参的时候,实际上只是把数组的首元素的地址传递过去了。数组名是数组首元素的地址。
2024-12-18 08:28:33
186
原创 C语言——数组_二维数组和数组越界
c语言本身是不做数组下标的越界检查,编译器也不一定报错,但是编译器不报错,并不意味着程序就是正确的,所以程序员写代码时,最好自己做越界的检查。所以数组的下标如果小于0,或者大于n-1,就是数组越界访问了,超出了数组合法空间的访问。数组的下规定是从0开始的,如果数组有n个元素,最后一个元素的下标就是n-1.像一维数组一样,这里我们尝试打印二维数组的每个元素。二维数组的行和列也可能存在越界。数组的下标是有范围限制的。
2024-12-17 20:13:37
413
原创 C语言——一维数组的那些事儿
数组创建,在c99标准之前,[ ]中要给一个常量才可以,不能使用变量。在c99标准支持了边长数组的概念。仔细观察输出的结果,我们知道,随着数组下标的增长,元素的地址,也在有规律的递增。//数组什么时候可以正常创建?//const_n 是一个常量表达式,用来指定数组的大小。1.数组是使用下标来访问的,下标是从0开始。但是对于下面的代码要区分,内存中如何分配。//type_t 是指数组的元素类型。2.数组的大小可以通过计算得到。接下来我们探讨数组在内存中存储。数组是一组相同类型元素的集合。
2024-12-16 18:09:48
577
原创 C 语言中函数声明、定义、递归
系统分配给程序的栈空间是有限的,但是如果出现了死循环,或者(死递归),这样有可能导致一直开辟栈空间,最终产生栈空间耗尽的情况,这样的现象我们称为栈溢出。一个过程或函数在其定义或说明中有直接或间接调用自身的一种方法,它通常把一个大型复杂的问题层层转化为一个与原问题相似的规模较小的问题来求解,递归策略只需少量的程序就可描述出解题过程所需要的多次重复计算,大大地减少了程序的代码量。1.许多问题是以递归的形式进行解释的,这只是因为它比非递归的形式更为清晰。函数1的定义是指函数的具体实现,交代函数的功能实现。
2024-12-14 14:23:19
753
原创 《C 语言中函数的深度剖析与实践应用》
1.我们知道在我们学习c语言编程的时候,总是在一个代码编写完成之后迫不及待的想知道结果,想把这个结果打印到我们的屏幕上看看。我们在开发的过程中每个程序员都可能用到,为了支持可移植性和提高程序的效率,所以c语言的基础库中提供了一系列类似的库函数,方便程序员进行软件的开发。·在计算机科学中,子程序,是一个大型程序中某部分代码,由一个或多个语句块组成。2.在编程的过程中我们会频繁的做一些字符串的拷贝工作(strcpy)。3.在编程时我们也计算,总是会计算n的k次方这样的运算(pow)。statement;
2024-12-10 12:10:38
464
原创 《C 语言语句控制与循环结构深度剖析》
用于控制程序的执行流程,以实现程序的各种结构方式,它们由特定的语句定义符组成,c语言有九种控制语句。当switch表达式的值并不匹配所有case标签的值时,这个default子句后面的语句就会执行。3.转向语句:break语句、goto语句、continue语句、return语句。在switch语句中,我们没办法直接实现分支,搭配break使用才能实现真正的分支。但是,如果你不想忽略不匹配所有标签的表达式的值时,该怎么办呢?如果表达式的值与所有的case标签的值都不匹配怎么办?0表示假,非0表示真。
2024-12-04 16:04:23
438
原创 《C 语言中结构体的神奇魅力 —— 自定义复杂对象》
结构体是把一些单一类型组合在一起的做法。书:名字+作者+出版社+定价+书号。人:名字+年龄+性别+地址+电话。c语言就给了自定义类型的能力。自定义类型中有一种叫:结构体。
2024-12-03 11:57:29
161
原创 《深入理解 C 语言中的内存与指针变量》
为了能够有效的访问到内存的每个单元,就给内存单元进行了编号,这些编号被称为该内存单元的地址。所以为了有效的使用内存,就把内存划分成一个个小的内存单元,每个内存单元的大小是1个字节。内存是电脑上特别重要的存储器,计算机中程序的运行都是在内存中进行的。//32位平台下地址是32个bit位(即4个字节)//64位平台下地址是64个bit位(即8个字节)编号---->地址---->地址也被称为指针。存放指针(地址)的变量就是指针变量。//指针变量的大小取决于地址的大小。//p为一个整形指针变量。
2024-12-02 18:31:32
205
原创 《C 语言关键字之 typedef、static 及相关特性》
一个全局变量被static修饰,使得这个全局变量只能在本源文件内使用,不能在其他源文件内使用。一个函数被static修饰,使得这个函数只能在本源文件内使用,不能在其他源文件内使用。static修饰全局变量的时候,这个全局变量的外部链接属性就变成了内存链接属性。static修饰局部变量的时候,局部变量出了作用域,不销毁的。本质上,static修饰局部变量的时候,改变了变量的存储位置。影响了变量的生命周期,生命周期变长,和程序的生命周期一样。编译+链接----->可执行程序。3.修饰函数--称为静态函数。
2024-11-30 18:17:44
434
原创 《C 语言中的数组与操作符》
/特点:从左到右依次计算,整个表达式的结果是最后一个表达式的结果。c语言规定:数组的每个元素都有一个下标,下标是从0开始的。数组是一组具有相同类型的元素的集合,这些元素被称为数组元素。5.单目操作符----只有一个操作数的操作符。//逗号表达式就是逗号隔开的一串表达式。10.下标引用、函数调用和结构成员。8.条件操作符(三目操作符)
2024-11-29 17:52:53
575
原创 《C 语言中的循环结构与函数应用》
c语言是(结构化)的程序设计语言。c语言中如何实现循环的呢?do...while语句。求任意两个数的和的方法。
2024-11-29 12:17:05
128
原创 《C 语言中字符串与转义字符的深度解析》
这种由双引号引起来的一串字符称为字符串字面值,或者简称。注:字符串的结束标志是一个\0的。在计算机字符串长度的时候\n是。"abcdef"--字符串。,不算作字符串内容。char--字符类型。
2024-11-29 09:06:25
348
原创 C语言中的变量、常量
1.局部变量的生命周期是:进入生命周期开始,出作用域生命周期结束。2.全局变量的生命周期是:整个程序的生命周期。(当全局变量和局部变量名字相同的情况下,局部优先)3.#define定义的标识符常量。局部变量--{}内部定义的变量。全局变量--{}外部定义的变量。printf是一个输出函数。2.const修饰的常变量。scanf是一个输入函数。3.变量的作用域和生命周期。是变量所在的局部范围。
2024-11-28 19:26:56
279
1
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人