- 博客(65)
- 收藏
- 关注
原创 PHP反序列化知识点
protected 声明的字段为保护字段,在所声明的类和该类的子类中可见,但在该类的对象实例中不可见,也就不能输出。因此保护类的变量在序列化时,前面会加上\0*\0的前缀。这里的 \0 表示 ASCII 码为 0 的字符(不可见字符),而不是 \0 组合。private 声明的字段为私有字段,只在所声明的类中可见,在该类的子类和该类的对象实例中均不可见,也就不能输出。因此私有类的变量在序列化时,前面都会加上\0类名\0的前缀。s:17:“\00类名\00op”;
2023-03-23 23:56:34
209
1
原创 Linux C子线程传参的注意事项
背景linux C提供了pthread_create函数用来创建一个子线程,该函数的最后一个参数可以往子线程的函数中传入一个参数,示例如下:#include <stdio.h>#include <stdlib.h>#include <pthread.h>void *child_thread (void *args){ int *argptr = (int *) args; int arg = *argptr; printf ("Argument i
2022-03-08 17:36:41
1121
4
原创 Linux PWN技巧之栈迁移
简介栈迁移简单将就是控制EBP/RBP、ESP/RSP寄存器,让栈帧指向一段我们可以控制的内存,从而实现控制栈上执行内容、控制程序执行流程的目的。栈迁移一般会将栈帧指向bss段(其他可读写内存段也可以),这种技巧是为了解决栈上空间太小,不够写入完整payload的情况。比如有个程序存在栈溢出的漏洞,但溢出的长度不够,只够覆盖到返回地址,不能读入完整的rop链,这种情况就可能要用到栈迁移的技巧了利用介绍以32位程序为例,描述一下栈迁移的核心思想。首先要理解leave和ret汇编指令的作用:lea
2022-02-16 18:52:20
1798
原创 结合延迟绑定分析ELF中的.plt .plt.got .got以及.got.plt
在逆向分析ELF文件的时候,常常会看到.plt .plt.got .got以及.got.plt这几个长得很像的节区,如下:readelf -S test如果ELF文件中还使用了静态或者动态链接文件中的符号,还会包含一个.rel.plt节关于这些节各自的作用,可以参考如下链接:https://www.codeleading.com/article/37234101170/https://stackoverflow.com/questions/58076539/plt-plt-got-what-i
2022-02-15 19:11:44
1333
原创 Liunux反调试
常见的思路:关闭gdb使用的文件描述符3,close(3)可以逆向分析可执行文件,通过patch可执行文件中的close函数来绕过隐藏进程pid或者使用fork+kill不断刷新进程pid使用ptrace调试自身,防止被gdb等使用ptrace系统调用的调试器的调试可以逆向分析可执行文件,patch可执行文件中的ptrace操作来绕过去除对程序运行无影响的段,用readelf无法分析可执行文件,gdb也就无法获取调试需要的文件相关信息...
2022-02-14 20:36:38
178
原创 pwntools使用第五弹——ret2dlresolve以及延迟绑定
简介关于ret2dlresolve利用的原理,可以参考如下博文:https://www.freebuf.com/articles/system/170661.htmlret2dlsolve的核心原理就是利用了延迟绑定技术,linux在加载ELF可执行文件的时候,包含的动态链接文件里的符号,并不会直接把这些符号的实际地址加载到内存中,而是会使用PLT + GOT 表来实现延迟绑定,简单说就是在第一次用到动态链接文件里的符号的时候才会去寻找符号的实际位置然后保存下来,下次使用的时候就可以直接访问了,关于延
2022-02-11 18:52:52
3550
原创 pwntools使用gdb attach卡在waiting the debugger的解决
环境ubuntu 21.04gdb 10.1.90python 3.9.5pwntools 4.7.0问题现象exp脚本中使用gdb.attach()命令调试,脚本会在waiting the debuger卡住:解决方法这是pwntools的bug,查看github的issue发现有人遇到了一样的问题:https://github.com/Gallopsled/pwntools/issues/1984解决方法是更新pwntools版本至已经修复的版本,不过目前只有测试版已经修复了,因此
2022-01-25 11:39:52
1738
原创 Linux C插入ko文件
参考如下链接:https://www.coder.work/article/163294只使用init_module()来加载模块,delete_module()卸载模块即可,原文中finit_module相关的调用可以不用
2022-01-22 18:46:42
965
原创 linux C解析获取ko文件的模块名
前言在使用ko文件的时候,有时候可能会出现模块名与ko文件名不一致的情况,比如下面的例子,插入了一个 test.ko 的文件,但实际上文件使用的模块名不是 test 而是 hello:因此不能简单的直接把ko文件名当作模块名来使用,否则在卸载模块的时候可能会出现模块无法找到的问题解决方案ko文件的模块名会保存在 THIS_MODULE 模块对象(类型为 struct module )中,该对象作为 .gnu.linkonce.this_module 节存储在内核模块文件中。使用如下命令可获取该节
2022-01-22 18:41:20
1766
原创 linux编译ko文件
示例文件源码随便在网上找了一个demo:#include <linux/init.h> #include <linux/kernel.h> #include <linux/module.h> static int funcIn(void) { printk("in module"); return 0; } static void funcOut(void) { printk("out module");
2022-01-21 15:31:05
5764
1
原创 linux C获取二进制文件的build-id
前言build-id是gcc编译二进制文件的时候,计算得到的一个二进制文件的标识,有点类似文件哈希,可以用来判断文件是否一致(是否是同一版本的源码编译得到的)。使用 file、readelf -n 等解析ELF文件的命令可以看到build-id:通过查阅资料得知,build-id的值是保存在elf文件的**.note.gnu.build-id**段中,因此解析出elf文件中的该字段便可得到build-id:关于build-id的简单描述(详细可以自行搜索):解决方案网上的一些思路1)git
2022-01-17 21:33:00
5235
原创 使用pandas对数据做快速傅里叶变换(FFT)
背景最近做实验,要对实验数据做统计分析,所有的实验数据都在一个excel文件里的几个sheet里,需要对每个表里的数据进行傅里叶变换并获得其对应的共轭复数,然后求出频率强度和频率,计算每个表中频率在0.05-0.15之间的频率强度的和与频率在0.15-0.4之前的频率的和的商,这里准备使用python3的pandas库来自动化处理数据步骤1. 读取excel中的数据使用pandas的read_excel方法可以获取:import pandas as pddf = pd.read_excel('(
2022-01-10 00:49:21
3344
原创 Linux父子进程的一些常见问题
使用fork()函数可以创建一个子进程,这个函数的特殊之处在于,调用一次会返回两次,父进程一次子进程一次,返回值可能的取值如下:1)在父进程中,fork返回新创建子进程的进程ID;2)在子进程中,fork返回0;3)如果出现错误,fork返回一个负值;执行过fork后,子进程中的操作就与父进程无关了,父进程可以通过wait/waitpid函数来获取子进程的状态。父进程需要关注一下僵尸进程,通过signal函数监听SIGCHLD信号来调用wait/waitpid函数回收子进程是一种比较常用的解决
2022-01-05 17:52:52
491
原创 C语言回调函数和钩子函数
这篇博文讲得挺清楚的:钩子函数和回调函数的区别总结一下,就是:回调函数更多的是目的处理,而钩子函数更多的是过程监控个人感觉这两种函数的界限似乎并没有特别明显,我就遇到过回调函数和钩子函数的注册函数是同一个的情况、(回调函数没有作为调用函数参数传入),这两个的函数的区别,举个例子来说明一下我自己的理解吧:比如有个libagent.so库提供了一个代理功能,可以用来跟服务端做交互,然后这个库的日志输出想统一输出到调用这个库的主程序的日志目录下,也就是说,日志打印这个功能最好由主函数来提供实现,这种情况下
2021-12-30 20:58:19
1121
原创 linux C获取本地IP地址
参考连接https://cloud.tencent.com/developer/article/1177071https://stackoverflow.com/questions/49335001/get-local-ip-address-in-c我现在是需要建立反弹shell,要从远程设备反弹至本地设备,所以需要获取本地ip,当前我在本地已经跟远程设备上的某个服务建立了连接,因此,可以使用上面连接中介绍的getsocketname的方法获取到本地ip,核心代码如下:struct sockaddr
2021-12-28 20:01:01
2618
原创 linux切换内核版本
前言做测试,需要在5.0.0的linux内核上才能正常运行,当前操作系统的linux内核为5.4.0,查了一下当前操作系统是支持在5.0.0内核上运行的,所以简单记录一下怎么切换内核版本环境操作系统:Ubuntu 18.04CPU架构:x86_64目标内核版本:5.0.0-36-generic步骤确认当前操作系统是支持在目标内核版本上运行,这个自行百度吧查看当前使用的内核版本:uname -a当前的内核版本为5.4.0-91-generic:查看当前操作系统启动引导中有
2021-12-17 15:18:20
5639
3
原创 Linux C开发TCP代理的注意事项
前言最近业务需求,需要在两个设备之间搞一个TCP代理,在这记录一下实际开发中遇到的一些坑场景介绍如图所示,进程A是服务端,进程B是客户端,A、B进程之间的消息通信需要由服务端和客户端的代理实现转发,A、B不能直接信方案设计通信采用socket来实现服务端代理首先要主动与进程A建立连接,并且需要监听一个可以被主机B连接到的端口,用于接收客户端代理发来的消息,其中当前设计,进程A监听的端口是由客户端代理发送给服务端代理的,也就是说客户端是知道进程A监听的端口的客户端代理首先要监听一个内部端口,
2021-12-08 16:25:39
696
原创 vxbox开启嵌套虚拟化
前言win10系统中安装了vxbox,然后装了一个ubuntu18.04的虚拟机,现在想在ubuntu虚拟机中使用qeme-kvm,发现不能直接运行,记录一下遇到的坑和解决方法步骤打开虚拟机设置,选择启动嵌套虚拟化支持:这里可能遇到的一个坑是,启用嵌套虚拟化这个选项可能是灰色的,不能选中,这个情况可以打开win10的命令行,进入到vxbox的安装目录,然后输入如下命令:VBoxManage.exe modifyvm "虚拟机的名字" --nested-hw-virt on然后再打开对应虚
2021-10-30 11:55:31
3371
原创 pwntools使用实践第三弹——ret2libc
题目2015-Defcon Qualifier R0pbaby一个比较基础的rop链构造题目,题目链接如下:https://github.com/ctfs/write-ups-2015/tree/master/defcon-qualifier-ctf-2015/babys-first/r0pbaby题目分析详细的分析可以参考这个博客:DEFCON-2015-r0pbaby大体步骤如下:首先checksec检查程序开启了哪些防护:objdump检查是否有可以直接使用的函数(system、
2021-09-14 20:36:51
424
原创 Linux下IPC实现——Unix domain socket
IPC实现主要有两种方式共享内存消息传递概念介绍Unix domain socket 又叫 IPC(inter-process communication 进程间通信) socket,用于实现同一主机上的进程间通信。socket 原本是为网络通讯设计的,但后来在 socket 的框架上发展出一种 IPC 机制,就是 UNIX domain socket。虽然网络 socket 也可用于同一台主机的进程间通讯(通过 loopback 地址 127.0.0.1),但是 UNIX domain socke
2021-09-03 17:13:48
1514
原创 Linux下的内存安全机制随笔——ASLR
linux中开启/关闭ASLR机制可以通过修改**/proc/sys/kernel/randomize_va_space**文件来实现,文件为不同数值表示不同的ASLR状态:0:关闭ASLR1:部分开启ASLR,只对 mmap()分配的内存地址、共享库、栈以及VSDO进行地址随机化2:完全开启ASLR,除了1状态下随机化的地址外,增加对brk()分配的内存地址的随机化注意:ASLR不会对程序的代码段和数据段(data、bss段)进行随机化,Linux下代码段和数据段的随机化是通过PIE机制实现的
2021-09-01 10:44:08
454
原创 GDB内存监控
常用命令命令描述watchgdb的内存功能mprotect系统库自带的内存保护函数,但只能按内存页大小(一般默认为4KB)进行保护,无法单独保护一个int大小等类似场景perf_event数据断点,Linux 2.6.33之后的版本支持该功能,将该功能封装为API后可在gdb或命令行中直接调用watch命令watch 全局变量名:watch *(void/int/char...... *)(内存地址)分析bug的时候可以使用watch命令快速确认几个疑似
2021-08-27 14:51:49
4248
原创 GDB多线程和子进程调试
常用命令命令描述info thread显示所有thread线程,*表示当前线程thread thread_numsgdb线程切换到对应threadthread apply ID1 ID2… command让一个或者多个线程执行GDB命令commandthread apply all command让所有线程执行GDB命令commandb xxxx thread thread_nums给thread_nums线程的xxxx函数打断点set sche
2021-08-27 10:45:19
483
原创 linux手写x64的shellcode
编写汇编代码下面的代码实现的是执行 execve("/bin/sh") 命令,rax寄存器存放execve的系统调用编号,rdi存放的是execve的参数:section .textglobal _start_start:push raxxor rdx, rdxxor rsi, rsimov rbx,'/bin//sh'push rbxpush rsppop rdimov al, 59syscall关于x64的系统调用表可参考如下博文:https://blog.csdn.ne
2021-08-25 11:22:56
1182
2
原创 pwntools使用第二弹——简单ROP实践
环境准备系统环境:Ubuntu 21.04内核版本:Linux 5.11.0cpu架构:x86_64gcc:7.5.0gdb:9.2python:3.8.5pwndbg:2020.07.23ROP概念介绍ROP是用来绕过NX保护的,开启 NX 保护的话栈、堆的内存空间就没有执行权限了,直接向栈或者堆上直接注入代码的攻击方式就无效了。ROP的主要思想是在栈缓冲区溢出的基础上,利用程序中已有的小片段 (gadgets) 来改变某些寄存器或者变量的值,从而控制程序的执行流程。所谓 gadg
2021-08-24 10:36:15
897
原创 正数、负数和补码
计算机中,正数、负数是怎么区分的呢,如何存放正数和负数?这里,就要用到补码这个概念了,先给出结论吧:正数和负数在计算机其实都是使用补码来存放的,并且在计算机中是没有减法运算的,减法实际上就是补码直接相加。正数和负数的补码补码是计算机存放数据之前对数据做了一种转换操作得到的,与补码相关的几个名词还有原码、反码:1、原码:字节的最高位为符号位,其余表示数值大小,最简单;2、反码:正数的反码和原码一样,负数的反码除最高位符号位外,其他位都取反;3、补码:在反码的基础上加1,这样可以方便计算机进行计算,可
2021-08-17 17:18:25
4911
原创 deepin升级Qt5并安装最新的qtcreator
0. 背景deepin15自带的qt是qt5.7,版本有点太老了,所以准备升级一下,升级到5.15,过程中遇到很多坑,这里记录一下做个备忘1. 下载Qt安装包这里直接去官网下载开源版即可:Qt官网链接这里下载只是一个安装程序,可以安装5.9到6.x所有版本的Qt,运行之后根据提示一步步安装即可:首先需要注册一个帐号,然后一路默认选项进入到第2步:根据需要选择要安装的版本和对应的包,这里我只需要开发桌面程序,因此只选择了安装源码和desktop:选择好Qt版本后,最下面有qt creato
2021-08-16 23:29:24
1355
原创 使用ssh远程连接家庭电脑
0.背景家里的电脑一般都是买的移动电信这些运营商的帐号,用pppoe的方式上网的,这种情况的话我们是没有公网ip的,也就是说我们的电脑是位于一个局域网里面的,所以我们是无法直接远程连接到我们的电脑的。为了实现远程连接到内网的电脑,我准备使用ssh反向连接来实现。1. 环境介绍主机A:内网电脑,这里我的系统是linux,用户名假设为test主机B:有公网ip的设备,可以直接买一个vps,ip假设为10.x.x.x,用户名假设为UserB主机C:远程设备,比如手机、办公室电脑等注意:上面所有的主
2021-08-14 16:13:59
5678
1
原创 Linux下的内存保护机制
0. 查看二进制文件开启的保护机制使用 checsec 命令查看,按照pwntools的话就会装上checksec:1. RELRO有关RELRO的技术细节 https://hardenedlinux.github.io/2016/11/25/RelRO.html有关GOT攻击的技术原理参考 http://blog.csdn.net/smalosnail/article/details/53247502RELOR开启/关闭gcc -o test test.c
2021-08-12 17:39:34
1528
原创 ESP32开发板连接TFT屏幕
前言esp32连接tft屏幕踩了很多坑,也查阅了很多资料,这里简单总结一下,希望能为像我一样的小白排一下坑。ESP32的引脚关于esp32的引脚功能,官方给出的文档写的比较多,官方文档如下:ESP32WROOM32技术指导书引脚的使用可以参考一下如下博客:ESP32引脚参考根据上面的文档说明,有一些引脚是不能用的,这点要注意下:所有的引脚如下图所示:驱动TFT需要的引脚TFT的引脚有如下几个:BLK可以不接线,GND直接连接开发板上标志GND的引脚,VCC连接开发板上标志3v
2021-08-08 23:20:55
17637
4
原创 关于C语言printf函数中英文混杂时对齐的问题
格式化输出函数printf首先看一下printf函数支持的标记符号flag标识-在给定的字段宽度内左对齐,默认是右对齐+强制在结果之前显示加号或减号(+ 或 -),即正数前面会显示 + 号。默认情况下,只有负数前面会显示一个 - 号#与 o、x 或 X 说明符一起使用时,非零值前面会分别显示 0、0x 或 0X;与 e、E 和 f 一起使用时,会强制输出包含一个小数点,即使后边没有数字时也会显示小数点。默认情况下,如果后边没有数字时候,不会显示显示小数点。与 g 或
2021-08-05 15:58:22
1719
原创 python3参数解析方法
前言百度python参数解析,得到的答案大多是使用getopt、optparse、argparse这几种方法,那么除了这几个方法,还有没有更加简洁方便的参数解析方法呢?使用click库实现参数解析使用 pip install click 安装click库,代码里 import click 引用该库即可使用,可以用修饰器来实现参数解析,配置起来是十分方便,示例代码如下:import click@click.command("test")@click.option('--string1', defa
2021-08-04 15:56:29
904
原创 vscode使用Arduino作为ESP-IDF的组件
环境准备参看我的前一篇博客:deepin配置基于vscode的esp32开发环境配置步骤打开vscode,按下ctrl+e+c,或者按F1然后手动收入如下命令,创建一个空白项目:选择如下模板即可:创建完成后会生成一个arduino-as-component目录,进入到目录里的components目录:然后执行如下命令:git clone https://github.com/espressif/arduino-esp32.git arduino && \cd ar
2021-08-04 00:15:06
4110
5
原创 deepin配置基于vscode的esp32开发环境
环境准备系统版本deepin 15.5 sp2专业版python版本python 3.7.11Git2.11.0Cmake3.9.5Ninja1.7.2vscode1.58.2注意:1.python版本要3.6.x以上2.cmake版本要3.5.x以上安装流程详细安装步骤可以参考如下链接ESP开发环境部署文档这里主要介绍一下基于vscode的开发环境的部署流程1. 安装准备正式安装前,需要先下载一些依赖的软件,这块内容在上
2021-08-01 15:12:03
708
原创 记录几个Linux C子进程和信号捕获相关的小问题
0. 背景最近在用C语言写一个C&S架构的小程序,有个核心功能是要客户端将一个可执行程序发送到服务端,然后由服务端拉起,该可执行程序会持续监听一个端口,等待客户端发送结束指令,其中由于环境限制,服务端是使用fork+execv命令来拉起的可执行程序子进程。但实际运行中发现了几个问题:1. 如果客户端在发送结束指令前意外停止,服务端拉起的子进程就无法关闭了;2. 子进程收到结束指令后,会产生一个僵尸进程(ps查看进程状态为Z);3. 服务端使用CTRL + C指令停止的话,有些残留文件信息没
2021-07-29 20:27:47
364
原创 pwntools使用初探——简单栈溢出的利用
注意的坑:buf长度要足够长,至少要大于shellcode的长度pwntools生成shellcode的时候要在shellcract语句前面加上context
2021-06-03 16:49:39
1502
原创 att&ck环境搭建
github地址:https://github.com/mitre-attack/attack-navigator下载最新的版本:将压缩包解压到自己的目录,进入到源码包目录的nav-app目录,执行安装命令 npm install:命令执行完成后,安装ng:npm install -g @angular/cli安装成功后,执行ng serve命令尝试启动服务:服务启动成功,默认绑定到4200端口,打开浏览器访问http://localhost:4200,选择创建企业安全的
2021-04-22 22:46:30
1387
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人