- 博客(47)
- 收藏
- 关注
原创 printf与inet_ntoa结合出现的问题
今天编程时发现使用代码如下,程序输出如下图printf("%s:%d -> %s:%d\n", inet_ntoa(flow->src_ip),flow->src_port, inet_ntoa(flow->dst_ip),flow->dst_port );通过gdb调试一直发现不了问题,flow的数值都对,但输出就是不对,源地址与目的地址相同。后来将代码改成如下:printf("flow: %s:%d --->",
2021-07-05 19:51:36
350
1
原创 arm简述
ARM(32bit)简述ARM指令的两种模式ARM处理器存在两种运行模式:ARM与Thumb,这两种模块均与特权模式无关,例如,运行在SVC模式的代码可以是ARM与可以是Thumb,这两种模式的主要区别在于指令集:ARM模式的指令集是32bit,Thumb模式的指令集为16bit(但是也可以是32bit)。在编写ARM shellcode的时候,确定什么时候以及如何使用thumb指令集是尤其重要的,通常编写shellcode我们需要克服null字节,我们通常可以使用Thumb指令集来替代ARM指令集,以
2021-04-20 23:17:24
890
原创 ArmPwn学习
arm pwn练习inctf2018_wARMup程序逻辑明显的栈溢出,但是只溢出了0x10个字节,很明显,需要栈迁移,但是在程序中,注意其调用read函数的汇编代码,如下,写如数据的缓冲区buf由R3寄存器重置,故若我们可以控制R3寄存器,则可以控制程序输入的位置,这里通过gadget(0x00010364 : pop {r3, pc})实现。注意程序的endlog,如下图,可以发现,程序的SP由R11寄存器控制,而由于栈溢出漏洞的存在,我们可以控制R11,故我们可以通过控制R11,将其指向b
2021-04-20 23:16:34
853
1
原创 一道题目入门VMpwn
一道题目学习VMpwn原理VMpwn 程序通常都是模拟一套虚拟机,对用户输入的opcode进行解析,模拟程序的执行,故VMpwn常见设计如下:初始化分配模拟寄存器空间(reg)初始化分配模拟栈空间(stack)初始化分配模拟数据存储空间(data)初始化分配模拟机器指令(opcode)空间(text)[OGeek2019 Final]OVM程序采用32bit定长指令,每个操作码、操作数均为8bit,其格式为:| opcode | dst | op1 | op2 |程序具体指令参考
2021-04-16 14:50:29
420
1
原创 一道题目学习glibc 2.32
一道题目学习glibc 2.32safe-linkingglibc2.32引入的新的防御机制-safe-linking(异或加密),其核心思想是:将指针的地址右移12位再和指针本身异或,如下,L为指针的地址,P为指针本身,该操作是可逆的,取指针时再做一次操作就可以还原得到原来的指针:该操作是在chunk被放入tcache bin和从tcache bin中取出时进行#define PROTECT_PTR(pos, ptr) \ ((__typeof (ptr)) ((((size_t) pos)
2021-04-14 13:26:32
1686
原创 glibc-2.27-how2heap学习
学习参考how2heap,主要用于理解不同版本glibc机制fastbin_dup#include <stdio.h>#include <stdlib.h>#include <assert.h>int main(){ setbuf(stdout, NULL); printf("This file demonstrates a simple double-free attack with fastbins.\n"); printf("Fill up
2021-03-26 09:11:42
993
原创 Kernel-pwn学习记录1
此博客参考POST如下:Learning Linux Kernel Exploitation - Part 1Learning Linux Kernel Exploitation - Part 2第一次进入Kernel Pwn领域,实验采用kernel-rop文件下载地址:https://ctftime.org/task/14383,对于Kernel Pwn,核心是利用LKM(Loadable Kernel Module,可加载内核模块)中存在的漏洞,而这些模块是在内核启动时自动运行的。上述链接下载
2021-03-25 15:16:12
984
原创 x86_64运行arm
#compile arm64 on x86_64arch64-linux-gnu-gcc -static -o hello64 hello64.c //staticarch64-linux-gnu-gcc -o hello64dyn hello64.c //dynamic#running 64bit./hello64 //staticqemu-aarch64 -L /usr/aarch64-linux-
2021-03-17 10:29:27
744
转载 How To Split A Fuzzer-Generated Input Into Several
这篇文章将指出如何将单个基于fuzzer变异生成的输入分成多个部分,即所谓的sub-inputs。为什么要将单一输入分成多个输入fuzz中将单一输入分成多个独立的部分非常有用且非常常见,有一些例子:fuzz正则表达式库需要fuzz 音频/视频格式解析器需要fuzz XSLT/CSS库需要:...
2021-03-01 16:25:04
366
转载 Fuzz Glossary
术语Corpus:语料库,又称test corpus或fuzzing corpus,为测试输入的集合,指能产生最大代码覆盖率的测试输入的最小集合Cross-pollination :这个术语来源于植物学,在植物学中,一种植物使另一种植物授粉。在模糊处理中,交叉授粉是指对一个模糊目标使用一个语料库来扩展另一个模糊目标的语料库。例如,如果有两个库处理相同的通用数据格式,那么对它们各自的语料库进行交叉授粉通常比较有利。Dictionary:是为模糊目标指定有目标趣标记的文件。大多数模糊引擎支持字典,并将调
2021-03-01 15:38:14
358
原创 DVRF-stack_bof_01
背景DVRF(Damn Vulnerable Router Firmware)是一个不错的IoT固件漏洞平台项目地址:https://github.com/praetorian-inc/DVRF提取固件binwalk -MeDVRF_v03.bin其提取出的文件系统是squashfs,存在漏洞的文件存放在pwnable/Intro下。测试程序cdsquashfs-rootcp (which qemu-mipsel-static) .sudo chroo...
2020-12-04 16:05:14
526
原创 wdb2018_guess-___stack_chk_fail泄露信息
背景知识在程序添加了canary保护后,如果我们读取的bof覆盖了对应的值时,程序就会报错,我们可以利用报错信息。程序在启动canary保护之后,如果发现canary被修改的话,程序就会执行__stack_chk_fail函数来打印argv[0]指针所指向的字符串,正常情况下,这个指针指向程序名。很简单,只要我们可以控制argv[0],就能知道我们想知道的信息。void __attribute__ ((noreturn)) __stack_chk_fail (void){ __forti
2020-11-03 11:09:13
423
原创 [V&N2020 公开赛]simpleHeap-记录一次gef调试过程
[V&N2020 公开赛]simpleHeap安全机制:IDA反汇编main:Add:Edit:可以看到get_input_content函数包含一个off_by_one漏洞。Show:Delete可以看到free函数之后,将chunkptr置为0,所以不存在UAF思路:利用off-by-one漏洞,篡改chunk的size大小,使被篡改大小的chunk覆盖其后已申请的chunk大小,从而导致chunk overlapping
2020-10-24 14:01:57
996
原创 Race Condition漏洞
Race ConditionRace Condition(竞争条件)是一种情形,在该情形下系统或者程序的输出受其他不可控事件的顺序或事件的影响。软件中的Race Condition通常出现在两个并发线程访问同一个共享资源。因而存在Race Condition漏洞的特权程序,通过对不可控事件施加影响,攻击者能够影响特权程序的输出。常见的Race Condition漏洞有一下两类Time-...
2020-01-17 00:15:37
2026
原创 关于竞争条件的对策
原子操作TOCTTOU竞争条件是由于检查操作和使用操作之间的间隔(也称窗口期)而导致的,原子操作旨在消除检查和使用操作之间的间隔,将检查和使用操作原子化,该对策需要操作系统级的支持。重复检查和使用竞争条件漏洞能否成功被利用,取决于攻击者能否赢得检查与使用之间的窗口,即能否在检查与使用间隔期间改变程序的输出,重复检查和使用方法旨在使攻击者更加难于赢得窗口,参考如下代码:#...
2020-01-16 19:38:58
591
1
原创 Linux-Sticky Directory
在Linux文件系统中,有一种目录存在特殊bit标记,该标记称作sticky bit,当目录设置了该bit,则该目录下的文件只能被文件拥有者、目录拥有者和root重命名或者删除,若果没有设置sticky bit,则任何拥有对目录写和执行权限的用户都可以重命名或者删除该目录下的文件,而不管该文件所有者是谁。&nbs...
2020-01-16 19:25:05
895
原创 如何写一个shellcode
什么样的shellcode可以起到最大的破坏,那就是能够满足攻击者各种各样需要的shellcode,怎么才能满足各种各样的需要呢?调用shell。如何写一个shellcode,以需要execve()系统调用的shellcode为例:%eax:eax寄存器需要存储11,这是execve()的系统调用号(system call number)%ebx:存储控制字符串“/bin/sh”的地址(e...
2020-01-16 16:16:38
561
原创 关于缓冲区溢出的对策
从编译器的角度出发以下两种方法均是编译器采取的关于缓冲区溢出的对策Stackshield主要思想是在函数调用之前,将return address的副本保存在一个安全的地方,函数返回时将返回地址与预先保存的返回地址比较,以判断缓冲区溢出是否发生。StackGuard在返回地址和缓冲区之间添加一段guard区,该guard区中可以由编译器存放一些不可预测的值,利用该guard区的值是否被篡改...
2020-01-04 19:46:11
3608
原创 Set-UID与环境变量
特权程序(privileged program)任何具有附加特权的程序都可以被认为是特权程序。特权程序有两种形式:daemon 和 Set-UIDdaemon:作为后台处理的程序,要想作为一个privileged program,需要具有特权的UID,例如root。在Windows系统中,称为services(服务),而不叫作daemon,services和daemon都是作为后台程序运行的...
2020-01-03 15:14:19
1516
原创 Linux-/proc文件系统
/proc是linux系统中的一个虚拟文件系统,它实际上不含有任何真正的文件,/proc中的文件如同linux内核中的内部数据结构的接口,通过这些接口,我们可以在系统运行时获取系统信息或者改变内核参数。/proc文件系统包含有每个进程的目录,每个进程由其PID号表示的文件夹表示,例如 进程230相关信息存放在/proc/230中,在shell中,$$是一个特殊的bash变量,其代表当前进程的PI...
2020-01-02 19:38:02
391
原创 SeedLab-ReturnToLibc
Lab Overview这个实验的学习目标是给学生体验有趣的缓冲区溢出攻击的变体,这种攻击攻击能够绕过实现在大多数linux操作系统上的保护机制。一种常见的利用BufferOverflow漏洞的方法是利用一段shellcode溢出buffer,然后使漏洞程序跳转到保存在栈上的shellcode,并执行shellcode,参考BufferOverflow漏洞。为了防止这种类型的攻击,一些操作系统允...
2019-12-31 22:34:56
1135
原创 SeedLab-BufferOverflow漏洞
实验概要实验地址: https://seedsecuritylabs.org/Labs_16.04/Software/Buffer_Overflow/ 该实验室的学习目标是让学生通过将他们从课堂上学到的有关漏洞的知识付诸实践,获得有关缓冲区溢出漏洞的第一手经验。缓冲区溢出被定义为程序试图在预分配的固定长度缓冲区的...
2019-12-31 00:12:08
4176
原创 C语言内嵌汇编
最近阅读linux源码,发现很多以asm volatile开头的C语言内嵌汇编语代码的函数,于是了解了一下,c语言内嵌汇编代码格式为:__ asm __ __ volatile __”(“statements”: “output_regs”:“input_regs”:;clobbered_regs):“__ asm ”表示后面的代码为内嵌汇编,“asm”是“ asm ”的别名。“...
2019-12-29 20:35:52
2414
原创 Windows内核-杂记
进程组成部分(1)一个核心态的对象,操作系统用来保存进程的信息(2)地址空间,包含可执行文件和所有动态链接库的代码和数据,以及动态分配的内存进程终止的方式(1)主线程的入口函数返回(如main函数)(2)进程主动退出,一个线程调用ExitProcess(3)进程被动终止,另一个进程调用TerminateProcess(任务管理器-结束任务 ),进程中所有线程被终止,不通知dll。(...
2019-12-24 15:28:39
277
原创 Windows内核-线程
以下针对WindowsXP线程三种状态:运行、等待、就绪。(1)处于运行态的线程存储在KPCR中(2)处于就绪态和等待态的线程处于另外33个链表中,其中1个是等待链表,32个是就绪链表。(Win7、WIn10 64个)。这些链表使用_KTHREAD(+0x60)追踪线程,即线程在某一时刻,只能属于其中一个圈。(不管是就绪态还是等待态都挂在_KTHREAD(+0x60),即在_KTHREAD中...
2019-12-10 13:24:11
547
原创 XCTF maze WriteUp
__int64 __fastcall main(__int64 a1, char **a2, char **a3){ signed __int64 v3; // rbx signed int v4; // eax bool v5; // bp bool v6; // al const char *v7; // rdi __int64 v9; // [rsp+0h] [rb...
2019-12-10 09:58:37
385
原创 Windows内核-系统描述符表与SSDT
以下参考自水滴教程及https://blog.youkuaiyun.com/weixin_42052102/article/details/83118255SystemServiceTableSystemServiceTable,即系统服务表,在XP系统下有两个 SystemServiceTable,分别是Ntoskrl.exe(常用的系统服务)和Win32k.sys(与图形显示及用户界面相关的系统服务)...
2019-12-08 12:28:13
506
原创 Windows内核-_Trap_Frame/ETHREAD/KPCR/KiSystemService
_Trap_Frame无论3环是中断门还是systementer进入0环,3环的寄存器都会寄存在_Trap_Frame结构体中,结构体如下:ETHREAD每个线程有一个ETHREAD结构体,该结构体保存了线程的状态...
2019-12-07 22:48:48
1943
原创 Windows内核-3环进0环
Windows API主要存放在C:\WINDOWS\system32下Kennel32.dll:最核心功能模块,如管理内存、进程和线程相关的函数User32.dll:Windows用户界面相关应用程序接口,如创建窗口和发送消息等GDI32.dll:全称Graphical Device Interface(图形设备接口)包含用于画图和显示文本的函数,比如要显示一个程序窗口,就调用其中的函数来...
2019-12-07 17:40:05
1715
原创 Windows内核-TLB
TLBTranslation lookaside buffer。根据功能可以译为快表,直译可以翻译为旁路转换缓冲,也可以把它理解成页表缓冲。里面存放的是一些页表文件(虚拟地址到物理地址的转换表)。当处理器要在主内寻址时,不是直接在内存的物理地址里查找的,而是通过一组虚拟地址转换到主内存的物理地址,页表文件(PTE page table entry 页表条目存放在内存中)就是负责将虚拟内存地址翻译...
2019-12-07 13:27:54
579
原创 Windows内核-10-10-12页表机制
以下参考资料:水滴教程,针对的是80386系统。CR3寄存器每一个进程对应一个CR3寄存器,CR3寄存器中存放的是PDT(页目录表)的地址。PDT\PDEPDT页目录表,一共占4KB,每一个页目录表项PDE占4B,即一共1024个PDE项,指向一个PTT页表。(其实实际实现时,PDT是一个特殊的PTT表,即上图转变成如下的图。)PTT\PTEPTT页表,每一个PDE指向一个PTT页...
2019-12-06 21:56:41
1250
原创 编译器优化
常量折叠a=1+2 ;由于结果可预见,编译器直接生成a=3常量传播a=1;若后续代码没有更改a,则编译器将a直接用其值1代替减少变量x=i2y=j2if(x>y){ …}/*对于x和y的比较,可以转换成if(I>j)*/复写传播类似于常量长传,不过传播的...
2019-11-29 22:06:14
183
原创 vs2019反汇编strlen
源代码#include<stdio.h>#include<string.h>int strlenTest(char szBuffer[]);int main() { char szBuffer[20] = "hello world"; scanf("%s", &szBuffer); int len = strlen(szBuffer); printf...
2019-11-29 13:53:56
3354
转载 段间转移、长调用、短调用
段间转移不同于段内转移,段间转移同时修改CS:EIP,而段内转移只修改EIP如JMP FAR 与JMP之间的区别段间转移JMP 0x20:0x004183D7流程 1、段选择子拆分:0x20=0x00100000 &nb...
2019-11-24 16:55:11
1434
原创 C++递归函数反汇编
源代码#include <iostream>using namespace std;int sumRecursion(int arr[], int n){ if (n > 0) { return sumRecursion(arr, n - 1) + arr[n - 1]; } return 0;}int main() { int arr[5] = { 1,2...
2019-11-22 16:41:55
395
原创 C++二维数组反汇编
最近在学反汇编,发现算法也尤其重要,故又回顾了算法与数据结构,在二维数组那块碰到了规则二维数组和不规则二维数组,故而想到用反汇编的方法查看二者底层的区别。规则二维数组源代码:很简单的二维数组#include<iostream>using namespace std;int main() { int arr[3][5] = { { 1,2,3,4,5 }, { 2,3,4,5...
2019-11-22 11:36:32
278
原创 C++堆对象数组反汇编
源代码:堆对象数组重要知识点:1、堆空间首地址为对象数组的个数2、析构函数存在一个标志参数(位0值为1表示释放一个对象,位1值为1表示释放一组对象,分别对应于汇编代码中的push 1和push 3);3、执行构造函数和析构函数,都由构造代理函数和析构代理函数来处理。源代码对应反汇编代码构造代理函数反汇编析构函数预处理反编译析构代理函数反汇编...
2019-11-11 20:24:20
205
原创 shell基础(条件判断)
判断格式test [选项] 文件或[ -e 文件 ]注意!!!!![]内的空格不可省略,即不可以写成[-e 文件]按照文件类型判断测试选项作用-b filename当filename 存在并且是块文件时返回真(返回0)-c filename当filename 存在并且是字符文件时返回真-d pathname当pathname 存在并且是一个目录...
2019-10-23 22:52:15
154
原创 Shell基础(字符处理)
cut 字段提取(提取列)格式: cut选项:-f 列号:提取第几列-d 分隔符:指定分隔符去分隔列例:cut -f 2,3 student.txt提取student.txt的第2、3列cat /etc/passwd | grep /bin/bash |grep -v root| cut -d “:” -f 1提取passwd中的普通用户的名字cut的弊端:没办法处理不...
2019-10-23 17:06:22
105
原创 Shell基础
创建shell文件vi hello.sh或者gedit hello.sh执行shell脚本语言chmod 755 hello.sh绝对路径/./hello.sh或bash hello.sh历史命令格式: history [选项][历史命令保存文件]-c 清空历史命令-w 把缓存中的历史命令写入历史命令保存文件**~/.bash_history**(CTF小考...
2019-10-22 11:09:43
128
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人