《二进制代码路径混淆技术研究》阅读笔记代码混淆技术的分类布局混淆删除或者混淆软件源代码或者中间代码中与执行无关的辅助文本信息,增加攻击者阅读和理解代码的难度。
删除注释之类的,改变字符(变量名,函数名等)名称。
数据混淆指在不影响软件功能的前提下,变换软件代码中的数据或数据格式,增加软件代码的复杂度,可以分为存储和编码变换、聚集变换和次序变换等。
存储和编码变换
分割变量,使得一个变量p表达成两个变量a,b的某种函数映射;
将简单的标量变成复杂的对象结构,如JAVA中的int型使用Integer类表达;
改变变量的生命周期,如局部变量变成全局变量;
将静态数据用函数表示;(这里感觉是2方法的一种延伸?)
修改编码方式,如用等价的多项式替换数组变量原始的下标表达式(f(x)->a,还是2吧)等;聚集变换通过将多个数据聚集在一起形成新的数据结构,实现隐藏原始数据格式的目的。
合并标量变量,将多个变量V1,…,Vn合并成一个变量Vm;
重新构造数组来混淆数组运算;
修改类的继承关系也可以增加代码的复杂度,可以把两个无关的类进行聚集,生成一个新的无意义的父类,也可以 ...
《红豆》陶云潜——三重创伤下的主体性回归对精神分析而言,《红豆》中的三子陶云潜是一个绝佳的分析案例:童年时期的和兄长的二元欲望关系,兄长战死后的第一重创伤、简望舒道明心声后的二重创伤、白思尧死亡后的三重创伤的相互作用。对陶云潜而言,根本性的创伤仍旧是兄长死亡的第一重创伤,并且在关键的二重创伤和重放式的三重创伤后,陶云潜的欲望与大他者的欲望彻底分离开,得到主体性的回归。
陶云潜作为陶家的三子,自小个体的欲望就被国尔忘家这样的宏大叙事所代替,这是他一直承担着的大他者;他的兄长陶云疏一直扮演着他的母亲角色,通过两者的相互欲望,陶云潜获得了自己的在想象界的完整性。
云潜首先遭遇的激烈冲突是兄长的为国捐躯——大他者将云潜从他和兄长的二元欲望关系中强行分离开了,但是结果怎么样,云潜的欲望真的和大他者欲望分离了吗?可以看到,云潜继承了兄长的遗志,他的欲望中心仍旧是大他者的欲望中心——国尔忘家。他的母亲能指——兄长的死亡,让他清楚意识到了象征秩序的存在,但是他没有将大他者在他身上的欲望(欲望他能投笔从戎)和自己的欲望(从事文艺事业)分离,而是将大他者欲望在事件后完全取代了自己的欲望。此时,云潜就陷入 ...
总的来说,这本书不太行。。。
并没有指出拉康为什么会把这些病症和阳具锚点关联,且大部分的内容我感觉都是弗洛伊德的精神分析的知识,可能只是把弗洛伊德的阳具象征化了而已。
引言临床上使用拉康学说的难点在于我们很难找到有指向性的地标,作者给了大致的方向:
第一类可能出现在形成诊断的过程中;
第二类是必须坚持的与行动治疗和动力有关的指导;
本书主要涉及的是精神病理结构的动力学和经济学描述,主要包括:倒错、癔症、强迫症。
诊断与结构精神分析中的诊断概念精神分析在设立之初就确定了临床精神分析的模糊性:预先设置一种诊断,以便决定治疗的进程,即便这个模型的相关性需要在诊断开始后才能得到确定。这也是精神分析诊断的临时性。
常规医学的诊断概念:
观察标准,类似医学的本体论,核心模型;
分类标准,根据不同的案例适配不同的方法;
因此医学诊断是病因学视角和区分性诊断学视角的双重视角。
但是精神分析唯一能得到的关于病人的信息只能从病人充满谎言的想象性的言辞中获得,这些言辞往往会掩盖病人的欲望。
尽管存在无意识的不可预测,精神分析也存在某种流程化的诊断,这种诊断是临时性的:
诊断需要被预设以确定方向但 ...
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 ...