![](https://img-blog.csdnimg.cn/20201014180756913.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
linux
文章平均质量分 70
flurry_rain
这个作者很懒,什么都没留下…
展开
-
Golang学习——基于vscode安装go环境
go环境搭建原创 2022-12-01 00:34:07 · 2191 阅读 · 0 评论 -
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 · 1085 阅读 · 4 评论 -
Linux PWN技巧之栈迁移
简介栈迁移简单将就是控制EBP/RBP、ESP/RSP寄存器,让栈帧指向一段我们可以控制的内存,从而实现控制栈上执行内容、控制程序执行流程的目的。栈迁移一般会将栈帧指向bss段(其他可读写内存段也可以),这种技巧是为了解决栈上空间太小,不够写入完整payload的情况。比如有个程序存在栈溢出的漏洞,但溢出的长度不够,只够覆盖到返回地址,不能读入完整的rop链,这种情况就可能要用到栈迁移的技巧了利用介绍以32位程序为例,描述一下栈迁移的核心思想。首先要理解leave和ret汇编指令的作用:lea原创 2022-02-16 18:52:20 · 1775 阅读 · 0 评论 -
结合延迟绑定分析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 · 1275 阅读 · 0 评论 -
Liunux反调试
常见的思路:关闭gdb使用的文件描述符3,close(3)可以逆向分析可执行文件,通过patch可执行文件中的close函数来绕过隐藏进程pid或者使用fork+kill不断刷新进程pid使用ptrace调试自身,防止被gdb等使用ptrace系统调用的调试器的调试可以逆向分析可执行文件,patch可执行文件中的ptrace操作来绕过去除对程序运行无影响的段,用readelf无法分析可执行文件,gdb也就无法获取调试需要的文件相关信息...原创 2022-02-14 20:36:38 · 170 阅读 · 0 评论 -
pwntools使用第五弹——ret2dlresolve以及延迟绑定
简介关于ret2dlresolve利用的原理,可以参考如下博文:https://www.freebuf.com/articles/system/170661.htmlret2dlsolve的核心原理就是利用了延迟绑定技术,linux在加载ELF可执行文件的时候,包含的动态链接文件里的符号,并不会直接把这些符号的实际地址加载到内存中,而是会使用PLT + GOT 表来实现延迟绑定,简单说就是在第一次用到动态链接文件里的符号的时候才会去寻找符号的实际位置然后保存下来,下次使用的时候就可以直接访问了,关于延原创 2022-02-11 18:52:52 · 3502 阅读 · 0 评论 -
Linux C插入ko文件
参考如下链接:https://www.coder.work/article/163294只使用init_module()来加载模块,delete_module()卸载模块即可,原文中finit_module相关的调用可以不用原创 2022-01-22 18:46:42 · 945 阅读 · 0 评论 -
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 · 5640 阅读 · 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 · 5023 阅读 · 0 评论 -
Linux父子进程的一些常见问题
使用fork()函数可以创建一个子进程,这个函数的特殊之处在于,调用一次会返回两次,父进程一次子进程一次,返回值可能的取值如下:1)在父进程中,fork返回新创建子进程的进程ID;2)在子进程中,fork返回0;3)如果出现错误,fork返回一个负值;执行过fork后,子进程中的操作就与父进程无关了,父进程可以通过wait/waitpid函数来获取子进程的状态。父进程需要关注一下僵尸进程,通过signal函数监听SIGCHLD信号来调用wait/waitpid函数回收子进程是一种比较常用的解决原创 2022-01-05 17:52:52 · 488 阅读 · 0 评论 -
C语言回调函数和钩子函数
这篇博文讲得挺清楚的:钩子函数和回调函数的区别总结一下,就是:回调函数更多的是目的处理,而钩子函数更多的是过程监控个人感觉这两种函数的界限似乎并没有特别明显,我就遇到过回调函数和钩子函数的注册函数是同一个的情况、(回调函数没有作为调用函数参数传入),这两个的函数的区别,举个例子来说明一下我自己的理解吧:比如有个libagent.so库提供了一个代理功能,可以用来跟服务端做交互,然后这个库的日志输出想统一输出到调用这个库的主程序的日志目录下,也就是说,日志打印这个功能最好由主函数来提供实现,这种情况下原创 2021-12-30 20:58:19 · 1103 阅读 · 0 评论 -
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 · 2600 阅读 · 0 评论 -
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 · 5564 阅读 · 3 评论 -
Linux C开发TCP代理的注意事项
前言最近业务需求,需要在两个设备之间搞一个TCP代理,在这记录一下实际开发中遇到的一些坑场景介绍如图所示,进程A是服务端,进程B是客户端,A、B进程之间的消息通信需要由服务端和客户端的代理实现转发,A、B不能直接信方案设计通信采用socket来实现服务端代理首先要主动与进程A建立连接,并且需要监听一个可以被主机B连接到的端口,用于接收客户端代理发来的消息,其中当前设计,进程A监听的端口是由客户端代理发送给服务端代理的,也就是说客户端是知道进程A监听的端口的客户端代理首先要监听一个内部端口,原创 2021-12-08 16:25:39 · 677 阅读 · 0 评论 -
vxbox开启嵌套虚拟化
前言win10系统中安装了vxbox,然后装了一个ubuntu18.04的虚拟机,现在想在ubuntu虚拟机中使用qeme-kvm,发现不能直接运行,记录一下遇到的坑和解决方法步骤打开虚拟机设置,选择启动嵌套虚拟化支持:这里可能遇到的一个坑是,启用嵌套虚拟化这个选项可能是灰色的,不能选中,这个情况可以打开win10的命令行,进入到vxbox的安装目录,然后输入如下命令:VBoxManage.exe modifyvm "虚拟机的名字" --nested-hw-virt on然后再打开对应虚原创 2021-10-30 11:55:31 · 3332 阅读 · 0 评论 -
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 · 416 阅读 · 0 评论 -
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 · 1451 阅读 · 0 评论 -
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 · 432 阅读 · 0 评论 -
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 · 4054 阅读 · 0 评论 -
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 · 474 阅读 · 0 评论 -
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 · 1167 阅读 · 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 · 830 阅读 · 0 评论 -
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 · 1307 阅读 · 0 评论 -
使用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 · 5587 阅读 · 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 · 1476 阅读 · 0 评论 -
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 · 894 阅读 · 0 评论 -
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 · 3923 阅读 · 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 · 669 阅读 · 0 评论 -
pwntools使用初探——简单栈溢出的利用
注意的坑:buf长度要足够长,至少要大于shellcode的长度pwntools生成shellcode的时候要在shellcract语句前面加上context原创 2021-06-03 16:49:39 · 1457 阅读 · 0 评论 -
调整虚拟机窗口大小
使用虚拟机运行linux系统的时候,有时候会出现屏幕比例没有合适的选项的情况,比如我的电脑是1920*1080,但display设置里没有,如下:这时候可以使用 xrandr 命令来自定义屏幕比例,比如添加上我的笔记本电脑的屏幕比例1920*1080:ok,问题解决了...原创 2021-03-28 17:23:57 · 2897 阅读 · 0 评论 -
rpmbuild打包rpm包总结
0. 前言最近需要用rpmbuild打包rpm包,遇到了一些问题,解决了一些问题,记录一下做个备忘。操作系统是linux。1. SPEC文件网上关于spec文件格式的说明很多,事例也很多,不再重复了,只记录一个自己遇到的问题:如果你的源码已经编译完成,不需要使用spec去编译,那么%prep %build字段可以不加。这两个字段的作用是去工作目录的SOURCE目录解压源码包到BUILD目录,然后执行构建操作,我的工程已经构建完成了,因此不需要往SOURCE目录放源码tar包再构建一遍原创 2021-01-21 23:48:28 · 1439 阅读 · 0 评论