PrefaceWalter Benjamin pointed out that Mozart and Kant had the same idea of marriage, which caused much indignation in moralistic circles. In this book, the same idea is put to work(implying that the book is kitsch), and many artists’ works will be interpreted from the perspective of Lacan. We would find what Lacan means in his “Kant with Sade” formula.
The book’s intention is twofold:
Use Lacanian theory to analyze the popular culture.
Show Lacanian theory helps the idiotic enjoyment of popu ...
前几天华为实习生的一道笔试题,可能是我投安全岗的原因,编程题比较简单,记录下:12345678910111213141516171819202122232425262728293031#include<iostream>using namespace std;int main() { int num; cin >> num; char **p = new char*[num]; for (int i = 0; i < num; i++) p[i] = new char[9]; for (int i = 0; i < num; i++) { for (int j = 0; j < 9; j++) { char tmp; cin >> tmp; p[i][j] = tmp; } } for (int i = 0; i < num; i++) { if ((p[i][0]-48)) { for (int j = 1; j < 9; j ...
0 Day 笔记
未读notes about chapter 25from 25.2下断点的技巧畸形RetAddr断点所谓畸形 RetAddr断点,就是将POC中溢出后覆盖的函数返回地址修改为一个非法地址(例如 0xFFFFFFFF),在调试POC时能够触发一个非法内存访问的错误,使得调试器中断下来。
条件断点条件断点是一个带有条件表达式的普通INT3 断点。当调试器遇到这类断点时,它将计算表达式的值,如果结果非零或者表达式无效,将暂停被调试程序。
od中在地址shfit f2即可。
举例:
调试记事本时,UNICODE [[ESP+4]]==”c:\test.txt”,表示当进入CreateFileW 函数后,如果第一个参数lpFileName为unicode 字符串”c:\test.txt”时则暂停被调试的程序。
消息断点消息断点是调试UI程序时的常用技巧。有时需要分析类似一个按钮被单击后程序的处理过程,就需要设置消息断点。消息断点其实是属于条件断点的,只不过是用消息来做表达式的。
内存断点调试过程更关心的是一些重要数据在内存中的读取、访问等操作,那就需要内存断点的支持了。
“Memory, on a ...
0 Day 笔记
未读notes about 0day chapter 15from 15.1微软在之前堆的基础上增加了堆的安全校验:
PEB random
Safe Unlink
Safe Unlink机制:
Windows sp2之前链表的拆卸操作:
123456int remove (ListNode * node){ node -> blink -> flink = node -> flink; node -> flink -> blink = node -> blink; return 0;}
SP2在进行删除操作时,将提前验证堆块前向指针和后向指针的完整性,以防止发生DWORD SHOOT:
1234567891011121314int safe_remove (ListNode * node){ if( (node->blink->flink==node)&&(node->flink->blink==node) ) { nod ...
0 Day 笔记
未读notes about chapter 14from 14.1开启SEHOP:
手工在注册表中HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\SessionManager\kernel找到DisableExceptionChainValidation项,将该值设置为0,即可启用SEHOP。
SEHOP的原理对SEH链进行检查,检查链表的最后一项是否为系统固定的终极异常处理函数,若是则表明SEH链完整,否则就有可能发生SEH覆盖攻击。
验证代码:
1234567891011121314151617181920212223242526272829303132if (process_flags & 0x40 == 0) { //如果没有 SEH 记录则不进行检测 if (record != 0xFFFFFFFF) { //开始检测 do { if (record < stack_bottom || record > stac ...
0 Day 笔记
未读notes about chapter13from 13.2 攻击未启用 ASLR 的模块from 13.3 利用部分覆盖进行定位内存地址
codes:
123456789101112131415161718192021222324252627282930313233343536373839404142434445#include<string.h>#include"stdlib.h" char shellcode[]="\xFC\x68\x6A\x0A\x38\x1E\x68\x63\x89\xD1\x4F\x68\x32\x74\x91\x0C""\x8B\xF4\x8D\x7E\xF4\x33\xDB\xB7\x04\x2B\xE3\x66\xBB\x33\x32\x53""\x68\x75\x73\x65\x72\x54\x33\xD2\x64\x8B\x5A\x30\x8B\x4B\x0C\x8B""\x49\x1C\x8B\x09\x8B\x69\x08\xAD\x3D\x ...
0 Day 笔记
未读notes about chapter 12from 12.3针对DEP,最好的攻击方法就是ret2libc,在可执行的模块里找到指令,构造出一条攻击链。这种方法操作难度极大,很难找到这么一条可行的攻击链。
书中给出了一些一般性的思路:
(1)通过跳转到ZwSetInformationProcess 函数将DEP 关闭后再转入shellcode执行。(2)通过跳转到VirtualProtect 函数来将shellcode 所在内存页设置为可执行状态,然后再转入shellcode 执行。(3)通过跳转到VIrtualAlloc 函数开辟一段具有执行权限的内存空间,然后将shellcode 复制到这段内存中执行。
利用ZwSetInformationProcess将DEP关闭后再转入shellcode执行一个进程的DEP设置标识保存在KPROCESS结构中的_KEXECUTE_OPTIONS中:
12345678_KEXECUTE_OPTIONSPos0 ExecuteDisable :1bitPos1 ExecuteEnable :1bitPos2 DisableThunkEmul ...
0 Day 笔记
未读notes about 0day chapter 11from 11.1简单回顾(SEH结构体):
Dword:Next SEH Header(低地址)
SEH链表指针
Dword:Exception Handler(高地址)
异常处理函数句柄
safeSEH机制的几个校验:
检查异常处理链(SEH链表指针)在当前程序栈中,若不在则终止异常处理函数得调用。
检查异常处理函数句柄是否在当前栈中,若在则终止。
在前面两项检查都通过后,程序调用一个全新的函数RtlIsValidHandler(),来对异常处理函数的有效性进行验证。
RtlIsValidHandler的一些验证:
检查程序是否设置了IMAGE_DLLCHARACTERISTICS_NO_SEH 标识。如果设置了这个标识,这个程序内的异常会被忽略。所以当这个标志被设置时,函数直接返回校验失败。
检测程序是否包含安全S.E.H 表。如果程序包含安全S.E.H 表,则将当前的异常处理函数地址与该表进行匹配,匹配成功则返回校验成功,匹配失败则返回校验失败。
判断程序是否设置ILonly 标识。如 ...
0 Day 笔记
未读notes about chapter 10
第九章:概述
from 10.1
以下情况不会应用GS。(1)函数不包含缓冲区。(2)函数被定义为具有变量参数列表。(3)函数使用无保护的关键字标记。(4)函数在第一个语句中包含内嵌汇编代码。(5)缓冲区不是8字节类型且大小不大于4 个字节。
from 10.2缓冲区不是8字节类型且大小不大于4个字节时该函数不会应用GS:
发生了溢出:
from 10.3使用199个”\x90”和一个”\0”作为参数传给buff参数,在strcpy结束后设置一个断点:
此时gsv的栈桢是这样的,紧接着的是一些参数(4个字节)以及:canary(0x862DE78E),前一个栈桢的EBP(0x0012FF7C),返回地址(0x004010C9),参数(0x00402100),虚表指针(0x004021D0)。所以buff区还差5*4=20个字节。
此时的virtual表的函数为:
继续覆盖20个字节的\x90,就可以看到虚表指针的最后一个字节已经被结束符”\0”覆盖掉了,指向了缓冲区的起始地址(0x00402100)。
之后我们要做的 ...
0 Day 笔记
未读note about chapter 8from 8.1 format string测试程序的堆栈情况:
此时首先入栈的格式化字符串读取前面进入栈的两个数:44(0x2C),77(0x4D)。但是第二个格式化字符串参数没有数据列表,于是顺着栈往下读,就是4218928(0x00406030)以及44(0x2C),若是继续读取就是77(0x4D)。
常见的格式化字符串漏洞:12345678910111213int printf( const char* format [, argument]... );int wprintf( const wchar_t* format [, argument]... );int fprintf( FILE* stream, const char* format [, argument ]...);int fwprintf( FILE* stream, const wchar_t* format [, argument ]...);int sprintf( char *buffer, const char *format [, argument] ...





