- 博客(52)
- 资源 (1)
- 收藏
- 关注
原创 如何检测socket是否关闭,socket的关闭检测及处理
socket的关闭检测及处理检测socket关闭reference SIGPIPE 信号处理整理调用write, send, sendto等发送函数时,触发 SIGPIPE 信号,导致程序直接退出。Program received signal SIGPIPE, Broken pipe.0x00007ffff7af2224 in write () from /lib/x86_64-linux-gnu/libc.so.6程序将 errno 设置为 EPIPE 之后,程序接受到内核发送过来的 SI
2021-10-23 21:54:48
6578
原创 socket 5协议详解
认证首先客户端向服务端发送认证信息,结构如下+----+----------+----------+|VER | NMETHODS | METHODS |+----+----------+----------+| 1 | 1 | 1 to 255 |+----+----------+----------+1就是指长度是一个byte,因此 1 to 255 也就是 1~255个byte。VER 是指协议版本,因为是 socks5,所以值是 0x05NMETHODS 是指
2021-03-27 01:30:58
4768
原创 codimd搭建
本文介绍使用docker搭建codimd安装codimd下载dockersudo apt install docker-compose docker.io获取docker-compose.yml,配置的时候注意6,7行的用户名和口令与第17行的保持一致在docker-compose.yml目录下使用docker-compose up -d命令拉起docker执行docker logs --tail 50 --follow --timestamps codimd_codimd_1命令查看进程拉
2021-01-17 03:41:49
2014
转载 htaccess
1 .htaccess简介1.1 什么是.htaccess文件从本指南中,你将可以学习到有关.htaccess文件及其功能的知识,并用以优化你的网站。尽管.htaccess 只是一个文件,但它可以更改服务器的设置,允许你做许多不同的事情,最流行的功能是您可以创建自定义的“404 error”页面。.htaccess 并不难于使用,归根结底,它只是在一个text文档中添加几条简单的指令而已。首先你要判断主机支持它这可能很难用简单的答案来回答。许多主机支持.htaccess,但实际上并不会特别声明,许多
2021-01-01 12:40:41
1821
转载 define宏定义中的#,##,@#及/符号
前言本文描述define宏定义中的#,##,@#及/符号的使用方法#的用法宏定义中的#字符串化操作符。其作用是:将宏定义中的传入参数名转换成用一对双引号括起来参数名字符串。其只能用于有传入参数的宏定义中,且必须置于宏定义体中的参数名前。例子#define STR(str) #strSTR(123)会被扩展为123int a = 123;STR(a); // 这里的宏会扩展为"a"这里的宏会扩展为"a"注意对空格的处理忽略传入参数名前面和后面的空格。如:STR( abc
2020-11-12 01:43:01
3816
原创 __attribute__
前言本文介绍__attribute__ 的使用方法__attribute__介绍要了解Linux Kernel代码的分段信息,需要了解一下gcc的__attribute__的编绎属性,__attribute__主要用于改变所声明或定义的函数或 数据的特性,它有很多子项,用于改变作用对象的特性。比如对函数,noline将禁止进行内联扩展、noreturn表示没有返回值、pure表明函数除 返回值外,不会通过其它(如全局变量、指针)对函数外部产生任何影响。子项描述section将变
2020-11-12 01:04:21
2061
原创 Python内存管理
Python的内存管理是依据对象引用次数管理的,对象被创建,分配内存给对象;对象引用计数为0,分配给对象的内存被回收。下面这些情况对象的引用计数+1:对象被创建:a = Create_Object()引用被赋值:b = a被作为参数传递给函数:f(a)作为容器对象的一个元素:lst = [1,a]下面这些情况对象的引用计数-1离开作用域。比如f(a)函数结束时,a指向的对象引用减1。引用被显式的销毁:del a对象的一个别名被赋值给其他对象:b = 1对象从一个容器对象中移除:lst.
2020-11-11 20:17:57
279
原创 plt表、got表与延迟绑定(Lazy Binding)
准备实验环境Ubuntu-Desktop 18.04$ uname -aLinux ubuntu 5.4.0-48-generic #52~18.04.1-Ubuntu SMP Thu Sep 10 12:50:22 UTC 2020 x86_64 x86_64 x86_64 GNU/Linuxso.2.27源码源码程序如下,我将其命名为plt.c#include<stdio.h>int main(){ puts("learning plt and got!\n");
2020-11-09 20:34:41
1500
原创 反调试技术
Windows反调试技术Windows API反调试IsDebuggerPresent用OD加载一个带IsDebuggerPresent的程序,在IsDebuggerPresent下硬件断点跟进,发现IsDebuggerPresent的汇编实现如下:MOV EAX,DWORD PTR FS:[0x30]MOVZX EAX,BYTE PTR DS:[EAX+0x2]RETNFS寄存器指向的是TEB(线程环境块),其数据结构如下:typedef struct _NT_TEB{ NT_
2020-11-05 01:26:40
1150
原创 upx手动脱壳
upxupx是一个开源的工具,可以到github下载upxupx简单的用法upx src.exe命令将src.exe加壳upx src.exe -o dst.exe命令将src.exe加壳并另存为dst.exeupx手动脱壳
2020-10-26 01:23:33
7168
1
原创 RAW与RVA
前言本文描述节区RAW与RVA之间的的转换RAW:文件偏移RVA:相对虚拟地址(是指相对与ImageBase的偏移)节区数据结构typedef struct _IMAGE_SECTION_HEADER { BYTE Name[IMAGE_SIZEOF_SHORT_NAME]; union { DWORD PhysicalAddress; DWORD VirtualSize; } Misc; DWORD VirtualAddress; DWORD SizeOfR
2020-10-24 20:51:03
2082
2
原创 手拆ELF(三,节区头表)
节区头表节区头的数据结构为Elf32_Shdr,大小为40字节,其数据结构如下:/* Section header. */typedef struct{ Elf32_Word sh_name; /* Section name (string tbl index) */ Elf32_Word sh_type; /* Section type */ Elf32_Word sh_flags; /* Section flags */ Elf32_Addr sh_addr; /*
2020-10-19 23:53:59
739
原创 手拆ELF32(二,程序头表)
目录程序头表节区头表程序头表一个可执行文件或者共享目标文件的程序头表是一个数组,一个数组元素存储一个程序头表条目,每一个程序头表条目描述一个段或者其它信息,这些段或信息为程序运行做准备。一个文件段包含多个节区,程序头只有在可执行文件或者共享对象文件中有意义。程序头数据结构如下,其大小为32字节/* Program segment header. */typedef struct{ Elf32_Word p_type; /* Segment type */ Elf32_Off
2020-10-18 23:29:37
1431
转载 控制流保护技术
Control Transfer Terminating InstructionsENDBR64 — Terminate an Indirect Branch in 64-bit ModeOpcodeInstructionOp/En64-Bit ModeCompat/Leg ModeDescriptionF3 0F 1E FAENDBR64NPValidValidTerminate indirect branch in 64 bit mode.Instruc
2020-10-18 11:39:38
840
原创 ptrace入坑指南
ptrace描述通过ptrace(),一个进程可以观察和控制另一个进程的执行,并检查和更改跟踪程序的内存和寄存器。它主要用于实现断点调试和系统调用跟踪。ptrace函数原型long ptrace(enum __ptrace_request request, pid_t pid, void *addr, void *data);ptrace用法PTRACE_TRACEME形式:ptrace(PTRACE_TRACEME,0 ,0 ,0)描述:本进程被其父进程所跟踪。其父进程应该希望跟踪子进程
2020-10-17 16:12:18
1011
原创 手拆ELF32(一,文件头)
EFL32ELF头#define EI_NIDENT (16)typedef struct{ unsigned char e_ident[EI_NIDENT]; /* Magic number and other info */ Elf32_Half e_type; /* Object file type */ Elf32_Half e_machine; /* Architecture */ Elf32_Word e_version; /* Object file vers
2020-10-13 15:39:15
2306
2
原创 安全编译选项
Linux地址空间随机化ALSR(Address Space Layout Randomization)ALSR将进程的某些内存空间地址进行随机化来增大入侵者预测目的地址的难度,从而降低漏洞被成功利用的风险。ASLR要求执行程序被加载到内存时,它其中的任意部分都是随机的。包括Stack、Heap、Libs 、mmap、Executable、Linker和VDSO(virtual dynamic shared object)Linux下ALSR是否开启取决于/proc/sys/kernel/rand
2020-10-03 16:14:16
2192
原创 Linux调试
gdb使用gdb -tui filename 命令help layout显示layout指令的帮助内容layout src显示源代码窗口和命令窗口layout asm显示汇编代码窗口和命令窗口layout split显示源代码窗口、汇编代码窗口及命令窗口layout regs显示寄存器窗口远程调试进入gdb交互shell之后执行target remote host:porthost: 远程主机的ip地址或者域名port:远程主机用于调试开放的端口GDB常见命令s(st
2020-10-03 11:38:49
488
原创 qemu创建虚拟机
Windows下使用qemu创建虚拟机创建系统镜像qemu-img create -f qcow2 Ubuntu.img 10G使用qemu创建一个大小为10G、文件系统格式为qcow2、文件名为Ubuntu.img的镜像安装OSqemu-system-x86_64 -m 2048 Ubuntu.img -cdrom Ubuntu-server20.04.iso-m参数表示内存,单位为MB启动OSqemu-system-x86_64 -m 2048 Ubuntu.img参考链接https
2020-09-23 21:30:24
1301
转载 MMU与OS
操作系统和MMU实际上MMU是为满足操作系统越来越复杂的内存管理而产生的。OS和MMU的关系简单说:a.系统初始化代码会在内存中生成页表,然后把页表地址设置给MMU对应寄存器,使MMU知道页表在物理内存中的什么位置,以便在需要时进行查找。之后通过专用指令启动MMU,以此为分界,之后程序中所有内存地址都变成虚地址,MMU硬件开始自动完成查表和虚实地址转换。b.OS初始化后期,创建第一个用户进程,这个过程中也需要创建页表,把其地址赋给进程结构体中某指针成员变量。即每个进程都要有独立的页表。c.用户
2020-08-31 00:43:22
313
原创 ret2libc
retlibcret2libc是返回导向编程(ROP)的一种,在开始数据执行保护的情况下,可以利用ROP执行shellcode前置知识(栈空间与函数调用)如果要调用一个函数,如system(const char *cmd),汇编中是这样的0x56555571 <+36>: lea eax, cmd0x56555577 <+42>: push eax0x56555578 <+43>: call 0x565553e0 <system@plt&
2020-08-30 16:52:35
272
原创 int too large to convert to float
溢出错误Python编程时遇到int too large to convert to float错误,例如计算pow(a, b)时,a十分大,b是小数,也就是开1/b次方,就可能遇到这种问题。解决方法使用decimal模块from decimal import *def my_pow(x, y, prec, modulo=None): a = Decimal(x) b = Decimal(y) getcontext().prec = prec if not modulo: c =
2020-08-23 23:41:51
12731
原创 arm neon指令
neon指令概述NEON指令按照操作数类型可以分为正常指令、宽指令、窄指令、饱和指令、长指令。正常指令:生成大小相同且类型通常与操作数向量相同到结果向量。长指令:对双字向量操作数执行运算,生产四字向量到结果。所生成的元素一般是操作数元素宽度到两倍,并属于同一类型。L标记,如VMOVL。宽指令:一个双字向量操作数和一个四字向量操作数执行运算,生成四字向量结果。W标记,如VADDW。窄指令:四字向量操作数执行运算,并生成双字向量结果,所生成的元素一般是操作数元素宽度的一半。N标记,如VMOVN。饱
2020-08-23 18:15:31
815
原创 arm_neon.h引用
安装依赖apt install gcc-arm-linux-gnueabihf -y # 交叉编译器apt install libnewlib-arm-none-eabi -y # arm_neon.hapt install libc6-dev-i386 -y # 解决/usr/include/stdio.h:27:10: fatal error: bits/libc-header-start.h: No such file or directory# /arm-linux-gnueabihf/
2020-08-23 09:10:30
4919
2
原创 COERCE_DOUBLE的含义
在IDA反汇编的时候,遇到如下代码 v8 = COERCE_DOUBLE(strtoull(&v25, (char **)&v22, 16)); v9 = COERCE_DOUBLE(strtoull(&v23, (char **)&v22, 16));那么COERCE_DOUBLE表示什么意思呢?其实是一个强制类型转换,相当于*(double *) & (strtoull(&v23, (char **)&v22, 16))COERCE_
2020-08-22 15:25:41
1416
原创 固件分析
相关链接https://paper.seebug.org/613/#11https://www.angelic47.com/archives/97/https://www.jianshu.com/p/12d8f509169c
2020-08-10 21:50:53
406
原创 Windows binwalk命令配置
本文目的通过本文,你将学到如何在Windows 10配置binwalk,使得binwalk能够在cmd中以cmd命令的方式运行。binwalk安装在确保你已经安装好Python并配置好Python的环境变量之后,在cmd执行pip install binwalk命令安全binwalk配置通过配置,...
2020-08-08 23:07:59
1534
原创 UAF原理及相关一道CTF
前言通过学习UAF原理及其在CTF中的应用,通过理论是实践相结合,可以更好地掌握UAF漏洞。UAF漏洞原理#include<stdio.h>#include<stdlib.h>int main(){ char *p1, *p2; p1 = p2 = NULL; p1 = (char *)malloc(10); if (p1 == NULL) { printf("fail to malloc p1"); exit(1); } memcpy(p1, "
2020-07-27 22:23:22
2946
翻译 size_t数据类型
size_t是用于表示对象大小的无符号整数类型,sizeof操作符的结果就属于这种类型,诸如malloc和memcpy等接受这种类型参数明确对象大小。在系统,使用GNU C库,size_t可能是unsigned int或者unsigned long int注意:size_t是声明任意包含对象大小的参数或变量的首选方法This is an unsigned integer type used to represent the sizes of objects. The result of the size
2020-07-26 23:56:52
557
原创 二进制漏洞挖掘常用工具
常用工具checksecIDAchecksecchecksec orgchecksec githubclick for downloading checksec命令行下载wget http://www.trapkit.de/tools/checksec.shIDA
2020-07-26 23:07:15
1111
1
翻译 pusha/pushad指令
pusha/pushad——push all the general-purpose registersOpcodeInstructionOp/En64-bit ModeCompat/Leg ModeDescription60pushanpinvalidvalidPush AX, CX, DX, BX, original SP, BP, SI, and DI.60pushadnpinvalidvalidPush EAX, ECX, EDX, EBX,
2020-06-12 21:55:51
5299
原创 Intel指令
目录repne scas byte ptr es:[edi]rep stos指令movzx指令mul与imul单操作数双操作数三操作数repne scas byte ptr es:[edi]该指令按字节扫描es:[edi]处的内存并和al寄存器比较,当它们相等时停止扫描。最大扫描的次数由ecx寄存器指定。每执行一次该指令,ecx寄存器减一,edi寄存器加一,相应的标志位寄存器也会发生变化。...
2020-03-28 13:53:17
853
原创 Java
Java数据类型类型大小(字节)byte1short2int4long8float4double8charbyte和String的互换String str = "hello world";byte[] strbyte = str.getBytes();String str = new String(strbyte)...
2020-03-11 23:09:16
141
翻译 scrypt
原文摘要1. 介绍2. memory-hard算法7. scrypt基于有序memory-hard的更健壮密钥派生Author: Colin Percival摘要我将介绍memory-hard算法的概念和有序memory-hard函数,并认为密钥派生为了最大程度地抵御自定义硬件攻击,其应该由有序memory-hard函数构造。我们提出在随机预言模型下的一组密钥派生函数哈希函数的集合...
2020-03-08 22:39:40
1945
原创 结构体对齐与结构体大小
在C/C++编程中,可以用#pragma pack(n)这个宏定义来说明结构的对齐大小,#pragma pack(n)说明程序中的结构体是按n字节对齐的实例假如有以下结构体typedef struct _A{ char a; int b; short c; long long d;}A;typedef struct _B{ int a; long long b; c...
2020-02-29 00:29:57
135
原创 glibc动态内存管理
GNU分配器翻译自 referenceGNU C库的malloc函数实现来自ptmalloc(pthreads malloc),而pthmalloc又用dlmalloc(Doug Lea malloc)实现。malloc函数有两种不同的内存分配方法,这取决于开辟空间的大小或用户传入的具体参数,最常见的分配方法是从一大块连续的内存区域分配一部分出来,并管理这些相邻的区块以优化其使用和减少浪费不可...
2020-02-18 11:10:54
392
原创 Python中使用C语言中的结构体
结构体基本结构from ctypes import *# 自己定义的结构体必须继承基类Structureclass MyStructure(Structure):# 结构体成员必须在字段_fields_中,且是可以是一个二元组或三元组 _fields_ = [ ("member1", c_int) ]>>> sizeof(MyStructure)4作出...
2019-12-24 21:55:35
2466
原创 微机原理实验,8086汇编
description编写一个简单的程序:将“This is my first ASM program-姓名(汉语拼音各人的姓名)”放在DS=1000H,BX=0000H开始的存储器单元中,然后将该内容搬移到BX=0100H开始的单元中,最后将该字符串通过DOS功能调用显示在屏幕上。EXE版本; 声明数据段data segment msg db "this is first as...
2019-10-29 15:41:23
3193
原创 求数组中的最大差值或最小差值
描述给出长度为n的整数数组arr[n], 有n个整数,求出数组中两个数的最大差值。算法可以先求出最大值和最小值,在一轮循环中求出最大值和最小值,时间复杂度就是O(n),两者之差就是差值最大的。求最小差值也是类似的。程序实现#include<stdio.h>unsigned int max_difference(const int *arr, unsigned int a...
2019-08-22 17:13:29
7040
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人