CS:APP第十一章学习
开始学 CSAPP的第十一章
逐步更新:
2023-02-06:开始写
梗概这一章就是讲了网络编程的实用性,我们身边要用到的所有跟网络有关的服务都需要用到网络编程,包括了浏览 Web、发送 email 信息或是玩在线游戏,你就正在使用网络应用程序。
这一节综合了前面一些理论知识,最后会做出一个成品来,期待ing。
客户端/服务器编程模型客户端/服务器编程模型(Client/Server)是网络编程的基本模型,模型中的基本操作是事务(transaction)
一个客户端—服务器事务由以下四步组成:
当一个客户端需要服务时,它向服务器发送一个请求,发起一个事务。例如,当 Web 浏览器需要一个文件时,它就发送一个请求给 Web 服务器。
服务器收到请求后,解释它,并以适当的方式操作它的资源。例如,当 Web 服务器收到浏览器发出的请求后,它就读一个磁盘文件。
服务器给客户端发送一个响应,并等待下一个请求。例如,Web 服务器将文件发送回客户端。
客户端收到响应并处理它。例如,当 Web 浏览器收到来自服务器的一页后,就在屏幕上显示此页。
这里需 ...
CS:APP第十章学习
开始学 CSAPP的第十章
逐步更新:
2023-02-01:开始写
梗概这里介绍了我们学习 Unix IO 的一个原因。第一点就是帮助我们理解更深层次的系统概念,第二点就是在某些编程环境下,除了最底层的 IO 我们别无选择。
Unix IO在 Linux 当中,一切皆文件,所有的 IO 设备都以文件的形式挂载在文件系统当中,我们需要输入输出只需要简单的读写文件即可,这使得我们访问任何设别都可以以简单一致的方式去访问:
打开文件:通过 open 函数打开一个文件,内核会记录这个文件的所有信息,用户层会返回一个文件描述符,用户层要操作文件只需要对文件描述符操作即可。
Linux在创建进程的时候有默认的三个打开的问及那:标准输入(stdin),标准输出(stdout),标准错误(stderr)。
改变当前文件的位置:对于每个打开的文件,内核会记录文件所在的位置 k,初始为 0,通过 seek 操作我们可以改变这个值。
读写文件:读文件就是把文件中从 k 开始到 k+size 的文件内容复制到内存,写文件就是把文件中从 k 开始到 k + size 的文件内容用内存中的某些值替换。 ...
吾爱破解2023红包题
吾爱破解2023红包题,由于太菜了,Android 难题都不太会写。
本篇文章主要精力在于分析第五天的题。
第二天直接拿 ida 动调,输入对应长度的字符串观察变化,发现主要和一个 data 段上等待数据比较。
就直接照着它的式子去写就ok了。
1234567891011121314151617181920212223242526272829#include<iostream>#include<stdio.h>using namespace std;unsigned char s[] ={ 0x98, 0x01, 0x00, 0x00, 0xB0, 0x01, 0x00, 0x00, 0x84, 0x01, 0x00, 0x00, 0x9C, 0x01, 0x00, 0x00, 0xEC, 0x01, 0x00, 0x00, 0xD4, 0x00, 0x00, 0x00, 0xC8, 0x00, 0x00, 0x00, 0x40, 0x01, 0x00, 0x00, 0xBC, 0x01, 0x00, 0x00, 0x28, 0x01, 0 ...
西湖论剑 2023 预赛 writeup
西湖论剑 2023 预赛 writeup
WEBWeb1[nodejs|原型链污染|ejs|拆分攻击]
前言主要是node 8.12.0的一个http.get解析洞,通过拆分攻击实现的SSRF攻击
和ejs RCE+safeobj原型链污染(CVE-2021-25928)
查了下这种属于拆分攻击(HTTP Splitting),和请求走私(HTTP Smuggling)有点区别。
RCE这里一开始挺简单,有个safeobj包,一看safeobj.expand(),游戏结束。
拿着POC测试了下环境,通过。
12345var safeObj = require("safe-obj");var obj = {};console.log("Before : " + {}.polluted);safeObj.expand(obj, '__proto__.polluted', 'Yes! Its Polluted');console.log("Afte ...
CS:APP第九章学习
开始学 CSAPP的第九章
逐步更新:
2023-1-30:开始写
2023-2-01:完成
梗概虚拟内存是当今操作系统最重要的概念之一,它提供了三个重要的能力:
它将主存视为硬盘的缓存,主存只保留活动区域(局部性原理)
它为每个进程提供一致的地址空间
它保护了进程的内存,防止被随意覆盖
物理和虚拟寻址计算机的内存被组织为一个由 M 个连续的字节大小的单元组成的数组,每个字节都有唯一的物理地址。CPU 访问内存最自然的方式就是使用物理地址,我们称为物理寻址 。早期的 CPU 是使用物理寻址的,而现代的处理器是使用虚拟寻址。
虚拟寻址与物理寻址相比,多了一步将虚拟地址翻译成物理地址的过程,翻译是通过一个内存管理单元(MMU)的专用硬件,通过查表得知的物理地址,这张表由操作系统管理。
地址空间地址空间是一个非负整数地址的有序集合:
如果地址空间中的整数是连续的,那么我们说它是线性地址空间。
为了简化讨论,我们假设地址空间是线性地址空间。
在带虚拟存储器的系统中,CPU从一个有 $N=2^n$ 个地址的地址空间中生成虚拟地址,这个地址空间称为虚拟地址空间。
一个地址空间 ...
Windows基础知识(2)
Windows基础知识(2)——鼠标键盘消息处理
前置芝士焦点一般来说,我们选中一个窗口就叫获取了一个焦点,键盘输入事件只会发送给具有焦点的窗口或者是控件。我们按下一个按键,会将我们的按键格式化成一个消息给内核,内核通过打包这个消息发送给具有焦点的窗体应用程序。
键盘事件我们可以处理的键盘按键大致分为两类:
系统按键:WM_KEYDOWN,WM_KEYUP。
非系统按键:WM_SYSKEYDOWN,WM_SYSKEYUP。
WM_KEYDOWN 事件表示一个键按下,如果一直按住会持续地发送此类消息。
123456789case WM_KEYDOWN: { switch (wParam) { case 'B': { MessageBox(NULL, L"123", L"123", MB_OK); break; } } break;}
WM_KEYUP 就是键盘弹起事件。
...
CS:APP第八章学习
开始学 CSAPP的第八章
逐步更新:
2023-1-25:开始写
2023-1-28:写完
梗概程序计数器假设有一个值序列 $a_1,a_2, … , a_{n-1}$,其中,每个 ak是某个相应指令 Ik的地址,每次从地址 ak到 ak+1的过渡称为 控制转移。而这样的控制转移序列叫做处理器的 控制流。最简单的一种控制流是一个平滑的序列,其中每个指令 $I_k$ 和 $I_{k+1}$ 在内存中的位置都是相邻的。当然也有平滑流的突变,即指令 $I_k$ 和 $I_{k+1}$ 在内存中的位置不相邻,通常是由跳转、调用和返回这种程序指令造成的。这些指令都是一些必要机制,使得程序能够对由程序变量表示的内部程序状态的变化做出反应。
同理,系统也必须能够对系统状态的变化做出反应,这些系统状态不能由内部程序变量捕获,而且也不一定要会程序的执行相关,现代系统通过使控制流突变来对系统状态变化做出反应,一般将这种突变称为异常控制流。
调试器触发断点的一种方法是,将断点处的目标指令替换为一个不规范指令(int 3),并捕获由此引发的异常。
所以,对于我们来说,学习异常处理是非常有必要的。
异 ...
Windows基础知识(1)
来学学 windows 的基础知识,在 C++ 中的实现。
字符类型在 C++ 中,两个标准的字符类型是 char 和 wchar_t 类型,分别是代表 ASCII 字符和 UNICODE 字符。windows 对它进行了二次定义,变成了 CHAR 和 WCHAR 类型。并且为了兼容环境,还出现了 TCHAR,它会跟着项目环境选择 CHAR 还是 WCHAR。
有个函数可以把单字节转为宽字节:MultiByteToWideChar。
1234CHAR* s = (CHAR*)"xia0ji233";WCHAR buffer[50];MultiByteToWideChar(CP_ACP, NULL, s, -1, buffer, 50);printf("%S", buffer);
这里格式化字符串 %S 不同于 %s,%S 是宽字符,如果使用 %s 则会因为 ASCII 字符转 unicode 多了一个 00 字节而被截断。
还有个函数可以转回去。
1234WCHAR* ws = (WCHAR*)L"xia0ji233"; ...
CS:APP第七章学习
开始学 CSAPP的第七章
逐步更新:
2023-1-20:开始写
2023-1-23:写完
梗概这一节讲的就是链接,链接作为编译可执行文件的最后一步,也是比较重要的,书上也罗列了一些链接带来的问题:
理解链接器将帮助你构造大型程序
理解链接器将帮助你避免一些危险的编程错误
理解链接将帮助你理解语言的作用域规则是如何实现的。例如,全局和局部变量之间的区别是什么?当你定义一个具有static属性的变量或者函数时,实际到底意味着什么
理解链接将帮助你理解其他重要的系统概念
编译器驱动程序它给了一个多文件编译的一个示例,也不写了,大概意思就是一个地方调用函数但是不写定义,另一个文件写该函数的定义,然后把两个文件一起编译得到可执行文件。
其实我们所说的广义上的编译器(如 gcc)指的是编译系统给我们提供的编译器驱动程序,它是语言预处理器(cpp),编译器(cc1),汇编器(as),链接器(ld)的集合。
把 main.c 和 sum.c 一起编译的一个命令是:
1gcc -o prog main.c sum.c
把它的步骤拆开就是这样的:
预编译展开头文件和替换宏定义
1cpp ...
游戏安全的学习(3)
游戏安全的学习(3)—— SDK dump。
学这个的终极目标肯定是去搞原嘛,但是虽然⚪的保护比上不足但是比下有余啊。所以还是先从无保护的游戏入手,是之前很火的一个 3d 恐怖解谜游戏 Granny。
Unity引擎Unity 引擎是个很火的支持跨平台的游戏引擎,它主要的实现有 il2cpp 和 mono 两个工具来完成。
因此它生成的游戏中,就会隐含这两个工具其中一个的接口,通过这些接口,我们可以 dump 出所有这些基类的派生类,方法名,属性名,属性类型以及它们的偏移等等。
获取了这些东西之后,我们要对游戏 hook 就非常容易了。
dump mono 平台的符号这里 CE 的源码其实实现了这些功能,对于一些基本的没有保护的游戏,我们就是一键 dump 符号。但是处出于学习的目的还是选择自己写一遍,复刻它 dump 的方法。
dump准备这里选择 dll 注入然后获取模块列表,得到之后直接去寻找关键的函数。对于 Mono 平台来说,关键函数是 mono_thread_attach,而 il2cpp 的关键函数是 il2cpp_thread_attach。
先写一个注入器去注 ...