- 博客(64)
- 资源 (14)
- 收藏
- 关注
原创 Windows (MinGW) 下read系统调用读取不完整原因分析及解决方案
程序执行结果如下,read不能读取完整文件,buf空间为1000000,足够容纳整个文件,结果不是预期的读取整个文件。默认是二进制模式的。因此,如果你的文件包含 0x1A。同样的代码在linux下执行是符合自己的预期的。打开文件,而在 Linux 上,,在 Windows 上,,导致只读取部分数据。在 MinGW 上,
2025-02-13 10:27:11
320
原创 记一次kylin v10 sp3系统sudo写系统配置文件无权限排查
1、首先考虑到权限问题,安装脚本通过pkexec来实现root身份获取,在脚本中加入了whoami命令,再次执行时输出了root,说明对应的用户没有问题,加入了cat /etc/profile,执行时可以看到正常输出/etc/profile文件内容,但是接下来写/etc/profile文件报无权限错误。3、第一反应是安全模块捣鬼,查看selinux,发现是禁用的,查看apparmor,也是没有启用,考虑到麒麟系统自身的安全模块kysec,查看状态,对应的文件保护也是off,
2024-11-19 15:54:38
523
原创 从汇编角度看C/C++函数指针与函数的调用差异
函数指针本质上是一个指针变量,只不过这个变量保存的地址是一个函数的地址,那么直接调用函数和通过函数指针调用有没有区别呢?答案是有的,下面的代码是一个直接调用函数和通过指针调用函数的例子,使用gdb反汇编main函数可以发现,直接调用函数对应的汇编指令是call 函数地址,而通过指针调用函数时,首先将函数的地址赋值给一个通用寄存器,call指令通过这个寄存器跳转到对应的函数,相对于直接调用,指针调用有个中转的过程。
2024-10-25 14:23:28
408
原创 C 变量作用域分析
C语言中,变量作用域分为进程作用域、文件作用域、函数作用域、{}块作用域,其中全局变量为进程作用域,整个进程都可以访问该变量;静态变量属于文件级作用域,在当前源码文件内可以访问;局部变量属于函数作用域,在函数内可以访问到;{}块语句内定义的变量,属于块作用域,智能在定义变量的{}块内访问。从执行结果可以发现,二个访问的g的地址一样,而二次访问s的地址不一样,验证了全局变量属于整个进程,而静态变量属于相应的源码文件。
2024-10-24 15:35:03
204
原创 c/c++ stdcall cdel fastcall等函数调用约定说明
调用约定参数传递顺序堆栈清理方式适用场景__cdecl从右到左压入堆栈调用者清理堆栈可变参数函数__stdcall从右到左压入堆栈被调用者清理堆栈Windows API 和 DLL继续深入探讨各种调用约定,特别是__cdecl__stdcall__fastcall和__thiscall的具体特点、优缺点、以及在实际开发中的应用场景。调用约定在 C/C++ 编程中扮演着重要的角色,影响着程序的性能、可读性和兼容性。正确的调用约定选择能够有效提高程序的效率,减少错误和不必要的性能损失。
2024-10-22 15:22:07
1223
原创 c语言变长数组底层原理
上面的例子可以看出,使用变长数组时可以在运行时确定数组长度而不是c89标准时必须在编译阶段确定大小,方便了程序的开发。可以看出数组a还是分配在栈上,这就意味着该数组的生命周期和其所在的作用域相同,当函数返回时,VLA的内存会被自动释放,不需要手动管理。
2024-10-22 15:11:25
538
原创 Linux 累加计算递归算法汇编实现
其终止条件为0,此时i && (i+f(i-1))表达式不成立,不计算i+f(i-1)直接返回0,调用栈开始回溯,至于为什么使用0作为终止条件,纯粹是保持代码简洁,参照这个思路,汇编代码如下。1+...+n可以使用公式计算,同时也是递归实现的很好例子,其c实现代码为。
2024-10-20 10:43:45
353
原创 Linux mips架构链接库函数调用plt表汇编代码分析
linux调用共享库中的函数时通过plt表和got表实现位置无关代码,过程中涉及到lazy binding,即在第一调用外部函数时解析被调用的函数地址并将地址写入到got表,后续调用则不需要解析函数地址。这一部分和硬件架构有关,具体的是和cpu指令集相关,下面分析龙芯3a4000芯片这一块的代码,3a4000采用的是mips指令集。使用gdb调试生成的可执行程序,打断点在mian函数的第一行。x /1xg 读取0x120019010-32640位置内存。使用info registers命令查看寄存器值。
2024-10-15 20:47:03
432
原创 Linux 位置无关(PIC)代码和代码重定位(relocate)
位置无关代码是指在任何内存地址处都可以正确执行的代码。这种特性使得代码可以在内存中任意位置加载而不需要修改。代码重定位是指在程序加载或运行时将代码和数据从编译时的地址映射到运行时的地址的过程。静态重定位: 在程序编译时决定地址,之后地址不变。动态重定位: 程序在运行时根据实际加载地址进行重定位。位置无关代码和代码重定位是现代操作系统中动态链接和共享库的重要组成部分。位置无关代码使得代码可以在内。
2024-10-06 11:11:24
605
原创 c语言函数变长参数原理分析
变长参数函数在 C 语言中提供了灵活性,允许函数根据需要接受不同数量的参数。通过stdarg.h中提供的宏,程序员可以轻松地访问这些参数,但同时也需注意相关的类型安全问题和调用约定。
2024-10-06 11:00:07
595
原创 Linux plt表调用汇编代码分析
执行r命令,并执行到int i=1这行代码,此时程序执行完a函数并输出,再次查看got表内容,可以发现got表对应的值改变为0x00007ffff7fcb105,反汇编a函数,可以看出a函数的地址也为0x00007ffff7fcb105,因此后续在调用a函数是,程序通过。linux调用共享库中的函数时通过plt表和got表实现位置无关代码,过程中涉及到lazy binding,即在第一调用外部函数时解析被调用的函数地址并将地址写入到got表,后续调用则不需要解析函数地址,具体过程如下。
2024-10-06 10:45:59
486
原创 Linux dlsym和直接调用函数地址解析分析
dlsym函数是 Linux 下动态链接库(shared library)编程中的一个重要函数。它用于在运行时获取动态链接库中符号的地址,通常用于获取函数指针或变量的地址。以下是dlsym函数的基本用法和示例。
2024-10-05 17:45:31
682
1
原创 dlinject分析,一种不使用ptrace的linux代码注入
在注入阶段结束后,目标进程会继续执行注入的shellcode,这段shellcode的功能包括加载第二阶段的shellcode并跳转到它的入口执行。脚本的主要功能是将自己生成的机器代码(shellcode)注入到目标进程中,并执行它。总体而言,该脚本通过暂停目标进程,注入自定义shellcode,然后利用目标进程的动态链接器。该文件提供了目标进程当前执行的系统调用信息,脚本利用它获取目标进程的当前指令指针 (这是脚本的核心函数,负责对目标进程进行注入。中的偏移地址,并计算其在目标进程中的绝对地址。
2024-09-29 18:26:27
869
原创 Linux c文件中创建一个由汇编代码构成的函数方法
这通常是在已存在的函数中通过asm将汇编指令嵌入到函数中,如何使用asm创建一个函数,这是有意义的,比方说上面的例子,对a函数进行反汇编,发现其汇编代码还可以进一步优化,如何创建一个完成由汇编代码构成的函数以便更好的控制,这一般是通过.S文件来实现的,下面给出一种在C文件中创建汇编函数的方法。下面是c函数的反汇编代码,其中movl $0x2,0x2eec(%rip) # 0x404030 这一条指令就可以完成对全局i赋值的原因是通过rip间接寻址。
2024-09-23 15:59:48
221
原创 Linux动态库防止逆向编译参数
在 Linux 中,使用 GCC 编译共享库(.so 文件)时,可以通过设置一些编译器和链接器选项来增加逆向工程的难度。将这些技术结合使用,虽然无法完全防止逆向,但可以显著增加逆向的难度和成本。
2024-09-21 15:51:13
618
原创 Linux firejail沙箱使用
Firejail 的配置文件位于目录下。你可以创建自己的配置文件并放置在该目录中,或者在用户的 Home 目录中创建一个目录,并将自定义配置文件放在那里。# 禁用网络 net none # 只读文件系统 read-only ~/Documents # 私有临时目录 private-tmp将上述内容保存为。
2024-09-19 15:45:18
826
原创 dwg2SVG 转化后文字丢失分析
开源项目中的dwg2SVG命令可以将dwg文件转换成svg文件,实际使用发现转化后的svg相对于dwg存在mtext字段丢失问题,对代码进行分析发现代码中不处理DWG_TYPE_MTEXT字段,所以存在文字不显示的情况。
2024-09-10 15:36:10
466
原创 dwg2text抽取dwg文件文字不完整分析
项目中dxf2text命令可以抽取dwg文件中的文字部分,编译完工程后对手头上的dwg文件提取时发现抽取不完整,对源码进行分析时发现该命令只处理了text部分,不处理mtext部分。
2024-09-10 15:06:24
293
原创 Linux LD_PRELOAD优先加载so失效原因分析
如果stick权限的LD_PRELOAD生效,那么linux上的提权太简单了,只要将自己的代码编译成so让具有stick权限的程序运行,既可用root身份运行自己代码,因此LD_PRELOAD在遇到stick权限时必须失效。可以看出passwd的属主是root,且用于stick权限,上图中的s,这就让普通用户执行passwd命令是,passwd对应的进程具有root权限,从而到达修改/etc/shadow文件的效果。说了这么多是为了给具有stick权限的程序LD_PRELOAD不生效做铺垫,
2024-08-12 15:57:48
770
原创 libemf2svg emf2svg-conv emf文件转svg段错误问题分析和解决方法
解决方法很简单,再增加一个判断,如果gindex还是比rmap_s大,则将gindex+1000赋值给rmap_s,这样realloc分配的内存足够使用,重新编译,再执行emf2svg-conv程序可以正常运行。,是微软公司开发的一种32位扩展图元文件格式,SVG是一种更为流行的矢量图文件,使用libemf2svg开源库中的emf2svg-conv将手头的emf文件转换为svg格式,发生段错误。EMF格式文件,全称为Enhanced Metafile,即增强型图元。使用gdb查看错误栈,没有看到直接原因。
2024-08-10 17:48:41
289
原创 Linux 使用thrift进行java和c++之间调用
项目需要,文件拼接检查这块使用的c语言完成的,项目是java的项目,考虑过jni调用,但存在c代码异常导致jvm崩溃问题,故采用thrift进行调用,保证java项目运行稳定,执行 thrift --gen cpp FileConcat.thrift,执行完成后生成gen-cpp目录,里面有几个.cpp和.h文件,我这不的机器上thrift版本。首先是执行thrift --gen java FileConcat.thrift,执行完后产生gen-java目录,里面有三个java文件,复制到项目中。
2024-08-10 10:15:21
285
原创 CEBX文件格式分析
CEBX全称Common e-Document of Blending XML,译为基于混合XML的公共电子文档。发现测试cebx文档共有4个entry,第一个entry的的偏移为26,通过此方法可以分析处cebx文件的真实大小,方便后续对文件进行拼接检查,测试发现可以有效的将cebx等文件从一个拼接文件中拆分出来。包由文件头描述(Header),文件流入口描述(Entry),各文件的内容流(BitStream)其中,Entry 和BitStream在一个包中可以出现多个,形成一组修改的历史记录,如图。
2024-08-10 09:18:38
491
原创 c c++大小端转换代码
为什么需要处理大小端的原因是数据会在网络上传播,如果数据不按照统一的标准,可能intel架构的电脑数据发送到arm的系统上就无法正确解析,因此文件格式在设计的时候就需要考虑这个问题,例如在intel + window10的系统上解析jpg格式文件,就需要处理大小端问题。cpu架构不同导致存在大端(Big Endian)和小端(Little Endian),是指数据的低位保存在内存的高地址中,而数据的高位,保存在内存的低地址中;是指数据的低位保存在内存的低地址中,而数据的高位保存在内存的高地址中。
2024-08-10 08:13:56
502
原创 隐写工具steghide linux编译安装
报错:configure: error: cannot find required auxiliary files: compile时需要执行autoreconf。编译完成后再src目录下又steghide执行下程序。
2024-07-31 07:49:57
614
原创 dps或者ppt文件判断是否加密 续
接上文微软文档让人无法理解 使用wps保存的及密码dps文件, 其headToken为 0xe391c05f,微软文档中说明powerpoint 2002中0xe391c05f可以为加密,因此还需要判断encryptSessionPersistIdRef的值。
2024-07-30 15:58:53
192
原创 dps或者ppt文件判断是否加密
同样的方法判断ppt也可以,但是在判断wps保存的dps文件时,提示没有加密,文件双击打开时又需要密码,查看ppt格式文档有下面发现。doc文件是否加密可以通过fib来判断,例如。后面再研究doc xls有没有类似的加密标识。查看文件的二进制发现了加密标识。
2024-07-29 20:45:40
383
原创 文件拼接检查
3.doc文件可以正常打开,但是看不到隐藏起来的2.png,可以通过对文件结构进行分析属于doc文件部分的内容,计算大小,如果文件真实大小比doc的内容大小大,则可能含拼接了其它文件,基于这个思路,可以将多个文件拼接出的文件进行拆分。文件检测需要根据文件结构进行大量的读操作,如果使用read和pread等系统调用进行数据读取,效率低下,可以使用mmap进行文件内存映射,由操作系统的page fault来按需要读取,可以大大提高效率。
2024-07-27 22:26:58
261
2
原创 emf文件在linux使用inkscape, libemf2svg libuemf poi读取中文乱码问题分析
identical to the font used to generate the indexes.说明文字中使用的index而不是文字对应的编码,这个是window系统特有,linux上的inkscape和libuemf没有ETO_GLYPH_INDEX这个的实现,所以在转码时把index当作utf16进行解码,因此出现乱码。
2024-07-14 19:53:18
394
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人