xina1i
xina1i
# SEH执行shellcode的原理 ## windbg推导栈溢出导致SEH代码执行 测试代码`vc6.0编译,win2000测试` ``` #include "stdafx.h" #include #include char shellcode[] = "\x61\x61\x61\x61\x61\x61\x61\x61\x61\x61\x61\x61\x61\x61\x61\x61" "\x61\x61\x61\x61\x61\x61\x61\x61\x61\x61\x61\x61\x61\x61\x61\x61" "\x61\x61\x61\x61\x61\x61\x61\x61\x61\x61\x61\x61\x61\x61\x61\x61" "\x61\x61\x61\x61\x61\x61\x61\x61\x61\x61\x61\x61\x61\x61\x61\x61" "\x61\x61\x61\x61\x61\x61\x61\x61\x61\x61\x61\x61\x61\x61\x61\x61" "\x61\x61\x61\x61\x61\x61\x61\x61\x61\x61\x61\x61\x61\x61\x61\x61" "\x61\x61\x61\x61\x61\x61\x61\x61\x61\x61\x61\x61\x61\x61\x61\x61" "\x61\x61\x61\x61\x61\x61\x61\x61\x61\x61\x61\x61\x61\x61\x61\x61" "\x61\x61\x61\x61\x61\x61\x61\x61\x61\x61\x61\x61\x61\x61\x61\x61" "\x61\x61\x61\x61\x61\x61\x61\x61\x61\x61\x61\x61\x61\x61\x61\x61" "\x61\x61\x61\x61\x61\x61\x61\x61\x61\x61\x61\x61\x61\x61\x61\x61" "\x61\x61\x61\x61\x61\x61\x61\x61\x61\x61\x61\x61\x61\x61\x61\x61" "\x61\x61\x61\x61\x61\x61\x61\x61\x61\x61\x61\x61\x61\x61\x61\x61" "\x61\x61\x61\x61\x61\x61\x61\x61\x61\x61\x61\x61\x61\x61\x61\x61"; DWORD MyException(void) {...
# DWORD SHOOT + SEH 利用 ## DWORD SHOOT形成分析 首先简要说一下DWORD SHOORT是怎么形成的,在堆的分配和回收的过程中,会发生链表结构的'拆卸'和'安装',如下图,A为链表结构的前向指针,B为链表的后向指针。只要记住一点,发生DWORD SHOOT时,A的内容会写入B,并且构成溢出后会执行B中指针所指向的代码 ``` +-------+ +--------+ | A |--------->| B | | | 其中SEH handler地址,我们查看到的是0x12ff2c为什么会变成30了呢?这里先用30尝试一下,具体原因下面再解释 获取堆的地址,并将数据复制进去  尝试执行  程序出错了,出现一个`Access violation`错误。为什么会出现这个问题呢?这个跟`HeapAlloc`函数的具体实现有关,这个有机会详细再分析一下。...
实验整理中 [笔记](https://app.yinxiang.com/shard/s58/nl/12833378/a67fabd1-b0ac-455f-b8b7-29f5c53d840d/)
# Linux off by one(基于栈) 从理论上去考虑off by one比较难理解,解释多了越解释越糊涂,因为我搜了好几篇文章都没有搞明白,所以直接跟着做实验,看到效果之后再来理解原理,会好理解很多! ## 命令执行实验 实验环境:docker ubuntu:16.04,代码vuln.c ```c #include #include void foo(char* arg); void bar(char* arg); void foo(char* arg) { bar(arg); /* [1] */ }...
# IoDeleteSymbolicLink遇到的问题 ## 遇到问题 在学习`NT driver`过程中,遇到了一个比较奇怪的问题,在`NTDDKUnload`中,删除符号链接,出现蓝屏 `DEVICE_EXTENSION`结构 ```c typedef struct _DEVICE_EXTENSION { PDEVICE_OBJECT pDevice; UNICODE_STRING ustrDeviceName; UNICODE_STRING ustrSymLinkName; } DEVICE_EXTENSION, *PDEVICE_EXTENSION; ``` 创建设备和卸载设备代码,其中`CreateDevice`属性为`INITCODE`,`NTDDKUnload`属性为`PAGEDCODE` ```c #define PAGEDCODE code_seg("PAGE") #define LOCKEDCODE code_seg()...
# Crackme160-003 ollydbg版本: 吾爱破解改进版 > 这个crackme主要就是考察浮点数运算 `测试数据name=33333, serial=666666` 开始的操作和`002`基本相同,找到带有`Wrong`字符串的汇编代码调用部分,在该函数的开始部分设下断点, `Ctrl+F2`,一直运行,直到第一次出现输入的`name`,可以认为这是算法的开始部分,一步一步分析 具体的分析加注释 第一部分 ``` 004081F2 . 50 push eax ; /String = "?譕藬痉,??p???????铨?藿磀?巀?????譕??痿(??蕶秀倊?????????诌嗿?痿,???瘵??篥.???嵀?????譕凬?僼痿(??蕶秀個??菿?????????" 004081F3 . 8B1A mov ebx,dword ptr ds:[edx] ;...
# 一道有趣的crackme ## 检查文件安全保护 存在ASLR保护  通过CFF Explorer绕过ASLR  ## 整体流程及概略分析  其中`call esi`调用的是`CreateMutexW`,程序验证操作是通过调用自己创建子进程来实现的,在子进程中判断一个互斥变量来决定进入的是子进程还是父进程。现在可以总结有两种方法调试: 1. 可以使用od跳过`CreateMutexW`,到判断程序进行操作 2. 直接跟进创建的子进程,在子进程中调试程序(该方法我还没有具体的操作方法) 现在利用方法1调试程序,我们首先跟进一下`CreateProcessW`看看参数是以什么方式传递的  可以看到参数的传递是以`unicode`的形式传递的,并且中间以`FF00`间隔。 在`CreateMutex`下断点,运行断在断点,直接右键将`GetCommandLineW`设置为新的`EIP`  可以发现`GetCommandLineW`将程序的路径作为参数传递进来,而且也是以`unicode`的形式传递的。如果我们直接继续运行,那么会产生栈溢出。 > 产生栈溢出的原因我们可以首先推敲一下,`GetCommandLineW`划分参数是通过`FF00`来判断的,但我们发现如果在不改变`GetCommandLineW`返回值的情况下,在数据窗口中没有看到任何`FF00`数据,那获取前一段数据的代码就极有可能发生溢出!通过分析后面的汇编代码也确实是这样,分配给name的长度是20h,分配给序列号的最大长度是(3c-20)h,作为name局部变量数组`ebp-20h`肯定会覆盖`ebp-4`这部分检查cookie的数据,所以会造成溢出! 利用od跳过互斥变量,之后再利用`CreateCommandLineA`获取命令行参数,主要有以下几点 1. 中间的间隔一定是`FF00` 2....
# XXE 漏洞 ## XML简单基础 ### XML规则 内部声明实体 `` 引用外部实体 `` 或者 `` ### 引入外部实体方式 1. 直接引入 ```xml "> %send; %extfile; ``` 在测试中,还有一种情况,可能测试成功不回显,但是在测试造成错误时,会把错误信息打印出来 ``` Warning: simplexml_load_string(): Entity: line 1: parser...
# SSRF 利用 SSRF目前我所见过的主要攻击本地服务器主要有两种方式一个是利用redis,另一种是利用Memcached 进行SSRF攻击,利用最多的库就是`libcurl`,比如php中的`curl_exec`,`curl`命令行等,可以先具体看看curl在SSRF中的作用。 ## SSRF 客户端主要利用方式 ### curl支持的协议 查看`curl`支持的协议 ``` # curl -V Protocols: dict file ftp ftps gopher http https imap imaps pop3 pop3s rtsp scp sftp...
# Stackoverflow + SEH的利用 ## SEH概述 SEH即异常处理结构体,是windows异常处理中使用的一种数据结构,每个SEH包含两个DWORD指针:SEH链表指针和异常处理函数句柄。 ``` +------------------------+ |DWORD: Next SEH Recoder | +------------------------+ |DWORD: Exception Handler| +------------------------+ ``` 1. SEH 存在于系统栈中,线程初始化时会自动安装一个SEH 2. 如果代码中使用了try/except/Asset等,编译器会向当前函数栈中插入一个SEH,从而实现异常处理。 3. 栈中的多个SEH会通过链表指针由栈顶串成一个单向链表,最顶端的SEH由TEB 0字节偏移处的指针表示。 4. 当异常发生时,操作系统会中断程序,首先从TEB中的0字节偏移处取出距离栈顶最近的SEH,之后使用异常处理函数句柄所指代码处理异常...