database
select table_name from mysql.innodb_table_stats where database_name=database();
```
-
+
##### MySQL 5.7 的新特性
@@ -812,7 +812,7 @@ select table_name from sys.schema_table_statistics_with_buffer where table_schem
select table_name from sys.x$schema_table_statistics_with_buffer where table_schema=database();
```
-
+
### 无列名注入
@@ -820,7 +820,7 @@ select table_name from sys.x$schema_table_statistics_with_buffer where table_sch
`select a,b from (select 1 as a, 2 as b union select * from users)x;`
-
+
## 超脱 MySQL 之外 (TODO)
diff --git a/6.计算机安全/6.2.1基础工具的使用.md b/6.计算机安全/6.2.1基础工具的使用.md
index 54122fd..3b794ea 100644
--- a/6.计算机安全/6.2.1基础工具的使用.md
+++ b/6.计算机安全/6.2.1基础工具的使用.md
@@ -12,7 +12,7 @@ IDA pro 是收费软件,价格极其昂贵,一套完全版人民币 10W 左
## 0x00 IDA 简单介绍
-
+
IDA是一款交互式反汇编和反编译工具,其支持文件类型和文件平台丰富。
@@ -20,7 +20,7 @@ IDA是一款交互式反汇编和反编译工具,其支持文件类型和文
## 0x01 启动界面
-
+
```
NEW:打开IDA同时弹出对话框选择要打开的文件
@@ -30,15 +30,15 @@ Previous,或者下面的列表项:快速打开之前的的文件
这里选择Go键,打开以后,将文件拖入
-
+
-
+
这里按我们的默认选项点击OK即可
## 0x02 关闭界面
-
+
```
第一个选项:就是不打包数据包文件,那么这些数据库文件就会分开这放。
@@ -53,15 +53,15 @@ Previous,或者下面的列表项:快速打开之前的的文件
反汇编代码的图表窗口
-
+
按**空格键**切换成文本结构的反汇编
-
+
按**F5**进行反编译跳转至`Pseudocode`(伪代码)界面
-
+
然后就可以分析代码逻辑了
@@ -71,19 +71,19 @@ Previous,或者下面的列表项:快速打开之前的的文件
十六进制窗口(不太常用)
-
+
## 0x05 主界面-Structures
结构体窗口
-
+
## 0x06 主界面-Enums
枚举类型界面
-
+
## 0x07 主界面-Imports
@@ -91,23 +91,23 @@ Previous,或者下面的列表项:快速打开之前的的文件
可以查看当前模块用了哪些模块的哪些函数
-
+
## 0x08 主界面-Exports
导出表
-
+
## 0x09 主界面-Strings
按`Shift+F12`转到`String`界面,该操作会搜索程序中的字符串数据并展示
-
+
按`Ctrl+F`后输入想要检索的字符可以快速搜索字符串
-
+
## 0x0a 其他界面-Functions
@@ -115,7 +115,7 @@ Previous,或者下面的列表项:快速打开之前的的文件
其中一般来说`main`是程序的主要函数
-
+
## 0x0b 其他界面-Output
@@ -125,13 +125,13 @@ Previous,或者下面的列表项:快速打开之前的的文件
另外还可以直接在下面输入python语句,方便在ida使用过程中简单的数据处理
-
+
## 0x0c 其他界面-导航栏
一个二进制文件包括不同的区块,这里显示程序的不同类型数据,不同的颜色代表二进制文件中不同的块
-
+
@@ -170,7 +170,7 @@ Previous,或者下面的列表项:快速打开之前的的文件
IDA 提供可与其交互的IDA Python接口,可以使用Python做很多的辅助操作
-
+
可以参考这篇文章了解常用的接口
@@ -184,17 +184,17 @@ IDA 提供可与其交互的IDA Python接口,可以使用Python做很多的辅
可以先在汇编代码或伪代码界面下断点,然后`F9`选择调试器,这里直接选`Local Windows Debugger`
-
+
之后就可以用F7(单步不跳过执行)/F8(单步跳过执行)/F9(继续执行,遇到断点停止)进行调试
-
+
### 调试Linux下的文件
可以先在汇编代码或伪代码界面下断点
-
+
由于Linux下文件调试比较特殊,需要远程起一个服务器运行服务端,这里可以使用**Vmware**或者**WSL2(Windows subsystem Linux)**进行调试
@@ -240,21 +240,21 @@ int main() {
##### 将程序拖入IDA
-
+
-
+
##### F5分析查看伪代码
-
+
发现有`change`和`check`的自定义函数
按`n`修改一下变量名
-
+
-
+
分别进入里面查看函数逻辑
@@ -262,11 +262,11 @@ int main() {
change函数
-
+
check函数
-
+
###### 静态分析逻辑
@@ -280,19 +280,19 @@ change函数是对输入字符串的每一个字节进行修改
随意的进行一些输入
-
+
然后断下来
-
+
F7进入函数进行单步不跳过调试
-
+
遇到类似`strlen`等库函数可以F8单步调试跳过
-
+
可以发现输入字符串的每一个字节的Ascii值都减小了1
diff --git a/6.计算机安全/6.2.2软件破解、软件加固.md b/6.计算机安全/6.2.2软件破解、软件加固.md
index aa9c56c..7ec8ecb 100644
--- a/6.计算机安全/6.2.2软件破解、软件加固.md
+++ b/6.计算机安全/6.2.2软件破解、软件加固.md
@@ -45,7 +45,7 @@ ESP 定律的原理在于利用程序中堆栈平衡来快速找到 OEP.
还是上一篇的示例, 入口一句 `pushad`, 我们按下 F8 执行 `pushad` 保存寄存器状态, 我们可以在右边的寄存器窗口里发现 `ESP` 寄存器的值变为了红色, 也即值发生了改变.
-
+
我们鼠标右击 `ESP` 寄存器的值, 也就是图中的 `0019FF64`, 选择 `HW break[ESP]` 后, 按下 `F9` 运行程序, 程序会在触发断点时断下. 如图来到了 `0040D3B0` 的位置. 这里就是上一篇我们单步跟踪时到达的位置, 剩余的就不再赘述.
diff --git a/6.计算机安全/6.2.3漏洞挖掘、漏洞利用.md b/6.计算机安全/6.2.3漏洞挖掘、漏洞利用.md
index e7d0a07..2be07c7 100644
--- a/6.计算机安全/6.2.3漏洞挖掘、漏洞利用.md
+++ b/6.计算机安全/6.2.3漏洞挖掘、漏洞利用.md
@@ -4,7 +4,7 @@
#### 栈介绍
栈是一种典型的后进先出 (Last in First Out) 的数据结构,其操作主要有压栈 (push) 与出栈 (pop) 两种操作,如下图所示(维基百科)。两种操作都操作栈顶,当然,它也有栈底。
-
+
高级语言在运行时都会被转换为汇编程序,在汇编程序运行过程中,充分利用了栈这一数据结构。每个程序在运行时都有虚拟地址空间,其中某一部分就是该程序对应的栈,用于保存函数调用信息和局部变量。此外,常见的操作也是压栈与出栈。需要注意的是,**程序的栈是从进程地址空间的高地址向低地址增长的**。
#### 栈溢出基本原理
@@ -21,7 +21,7 @@ int main()
对于如上程序,运行后可以发现`ch`和`a`的地址相差不大(`a`和`ch`的顺序不一定固定为`a`在前`ch`在后):
-
+
可以发现`ch`和`ch2`刚好差`8`个字节,也就是`ch`的长度。
`ch`只有`8`个字节,那么如果我们向`ch`中写入超过`8`个字节的数据呢?很显然,会从`ch`处发生溢出,写入到`ch2`的空间中,覆盖`ch2`的内容。
@@ -37,7 +37,7 @@ int main()
}
```
-
+
这就是栈溢出的基本原理。
@@ -131,7 +131,7 @@ retn
可以看到其中使用`call`指令来调用`add`函数。那么该指令是如何工作的呢?其实`call`指令相当于`push next_loc;jmp loc`,通过将`call`指令下一行汇编的地址压栈的方式,等到函数调用完再取回,从而从`call`指令的下一行继续执行。由于栈地址从高向低生长,新调用的函数的局部变量生成在返回地址的上方(低地址处),因此如果我们在新函数中使用栈溢出来修改这一返回地址,如果将返回地址修改为某个函数的地址,就可以执行任意函数:
-
+
> 注意该图中,使用32位的寄存器(EBP、ESP、EIP),实际原理一样的,并且上方为高地址,下方为低地址
@@ -139,22 +139,22 @@ retn
32位的程序,我们使用IDA来打开该题目,查看反编译代码,可以发现有非常明显的栈溢出:
-
+
由于第`8`行`gets`函数并没有检查输入的长度和`s`的长度,我们可以轻易地通过栈溢出来控制`main`函数的返回地址。而在程序中,存在另外一个函数`secure`,在该函数中有一个后门`system("/bin/sh")`,如果我们想办法执行该后门,就可以拿到目标机器的`shell`,从而控制目标计算机。
由于我们需要将返回地址在标准输入中输入待测程序,而返回地址拆分成小端序的字节后经常无法手动输入到待测程序中,所以此处我们使用`pwntools`这一`python`包来方便地进行攻击。
首先查看后门的地址:
-
+
接着计算溢出长度,这里我们使用gdb来调试程序,图中的gdb安装了pwndbg插件,该插件在pwn调试时比较好用:
-
+
将断点打在`gets`函数前后,可以看到此时`esp`值为`0xffffcd80`,`ebp`值为`0xffffce08`,在 IDA 中我们又可以看到`s`相对于`esp`的偏移为`+1C`,此时我们即可计算`hex(0xffffcd80+0x1c-0xffffce08)=-0x6C`,即`s`相对于`ebp`的偏移为`0x6C`,由于在`main`函数的开头有`push ebp`的操作,所以将`0x6C`再加`4`,即可到达返回地址处:
-
+
```python
from pwn import *
@@ -165,7 +165,7 @@ sh.sendline(exp)
sh.interactive() # 切换为手动交互模式
```
-
+
##### 0x1
通过上面的学习,我们已经可以知道执行任意函数的办法,但很多情况下,对于攻击者来说,程序中并没有可用的后门函数来达到攻击的目的,因此我们需要一种手段,来让程序执行任意代码(任意汇编代码),这样就可以最高效地进行攻击。ROP(Return Oriented Programming)面向返回编程就是这样的一种技术,在栈溢出的基础上,通过在程序中寻找以retn结尾的小片段(gadgets),来改变某些寄存器、栈变量等的值,再结合Linux下的系统调用,我们就可以执行需要的任意代码。
diff --git a/7.网络应用开发/7.1.1.1基础部分.md b/7.网络应用开发/7.1.1.1基础部分.md
index 0a73110..ca6cc8b 100644
--- a/7.网络应用开发/7.1.1.1基础部分.md
+++ b/7.网络应用开发/7.1.1.1基础部分.md
@@ -43,13 +43,13 @@
设计稿如下:
-
+
#### 可能需要用到的图片资源
-
+
-
+
#### 基本要求
@@ -91,9 +91,9 @@
### 🎫TodoList
-
+
-
+
一些参考
@@ -119,7 +119,7 @@
- 实现不同设备屏幕尺寸的自适应
- 添加任务热力图(可以参考一下 GitHub 个人主页哦 🤔)
-
+
#### 可能涉及的知识点
diff --git a/7.网络应用开发/7.1.1.2进阶部分.md b/7.网络应用开发/7.1.1.2进阶部分.md
index e4526d3..0f59f52 100644
--- a/7.网络应用开发/7.1.1.2进阶部分.md
+++ b/7.网络应用开发/7.1.1.2进阶部分.md
@@ -10,11 +10,11 @@
如果你曾经用过助手的小程序,你可能会在首页看到这样的天气卡片:
-
+
当然了,平时大家也会用到各种天气 APP
-
+
那么,让我们动手实现一个天气卡片吧~
@@ -63,9 +63,9 @@
## 🎶 音乐播放器
-
+
-
+
相信你平时或多或少都会听音乐,那么你是喜欢用网易云还是 QQ 音乐呢?或者是系统自带的音乐播放器?不过,其实你也可以自己做一个音乐播放器,来满足你对听音乐这件事的所有幻想,听起来是不是很酷呢 😎~那么,来试试看吧!
diff --git a/7.网络应用开发/7.1.1.5附录3:跨端开发.md b/7.网络应用开发/7.1.1.5附录3:跨端开发.md
index f5cd32e..96569af 100644
--- a/7.网络应用开发/7.1.1.5附录3:跨端开发.md
+++ b/7.网络应用开发/7.1.1.5附录3:跨端开发.md
@@ -69,7 +69,7 @@
它是基于WebView渲染,通过JS Bridge 把一部分系统能力开放给JS调用。
-
+
WebView容器的工作原理是基于Web技术来实现界面和功能,通过将原生的接口封装、暴露给JavaScript调用,JavaScript编写的页面可以运行在系统自带的WebView中。这样做的优势是,对于前端开发者比较友好,可以很快地实现页面跨端,同时保留调用**原生的能力**,通过搭建桥接层和原生能力打通。但这种设计,跨端的能力受限于桥接层,当调用之前没有的原生能力时,就需要增加桥。另外,浏览器内核的渲染独立于系统组件,无法保证原生体验,**渲染的效果会差不少**。
@@ -80,7 +80,7 @@ WebView容器的工作原理是基于Web技术来实现界面和功能,通过
浏览器提供了一个容器,屏蔽了底层差异,提供了统一的 api(dom api),这样就可以实现同一份代码跑在不同平台的统一的容器里。这个容器叫做浏览器引擎,由 js 引擎、渲染引擎等构成。
-
+
#### PWA
尽管PWA的出现不是为了“跨端”,但他们对于“跨端”的天然支持,能够让一套代码运行在PC、移动两端,就再一次产生了跨端设计实施的可能性。
@@ -107,7 +107,7 @@ PWA 是 Google 于 2016 年提出的概念,于 2017 年正式落地,于 2018
#### Electron
-
+
Electron 是使用 JavaScript,HTML 和 CSS 构建跨平台的桌面应用程序的框架,可构建出兼容 Mac、Windows 和 Linux 三个平台的应用程序。
@@ -123,7 +123,7 @@ Electron 的跨端原理并不难理解:它通过集成浏览器内核,使
#### React Native
React Native 是一个由 Facebook 于2015年9月发布的一款开源的 JavaScript 框架,它可以让开发者使用 JavaScript 和 React 来开发跨平台的移动应用。
-
+
React Native 的思路是最大化地复用前端的生态和 Native 的生态,和 WebView 容器的最大区别在于 View 的渲染体系。React Native 抛弃了低效的浏览器内核渲染,转而**使用自己的 DSL 生成中间格式**,然后映射到对应的平台,**渲染成平台的组件**。相对 WebView 容器,体验会有一定的提升。不过,渲染时需要 JavaScript 和原生之间通信,在有些场景可能会导致卡顿。另外就是,渲染还是在Native层,要求开发人员对Native有一定的熟悉度。
@@ -150,7 +150,7 @@ Flutter与上述Recat Native、WebView容器本质上都是不同的,它没有
微信小程序的渲染层与逻辑层分别由两个线程管理,渲染层的界面使用 webview 进行渲染;逻辑层采用 JSCore运行JavaScript代码。
-
+
## 类前端开发:拿过来吧你
@@ -166,7 +166,7 @@ Flutter与上述Recat Native、WebView容器本质上都是不同的,它没有
JS UI框架采用类HTML和CSS Web编程语言作为页面布局和页面样式的开发语言,页面业务逻辑则支持ECMAScript规范的JavaScript语言。JS UI框架提供的类Web编程范式,可以让开发者避免编写UI状态切换的代码,视图配置信息更加直观。
-
+
## 跨端不只是跨端:爱你的全世界
@@ -174,9 +174,9 @@ JS UI框架采用类HTML和CSS Web编程语言作为页面布局和页面样式
## 什么样的场景可以跨端?
跨端应用能够真正推进下去,除了有技术保障外,还需要合适的需求场景,使用PC端的功能型产品主要是需要大屏带来的“效率”(办公、个人管理、教育)与“沉浸”(数据、金融、游戏、影视)体验。
-
+
-
+
依赖PC、移动双端进行经营管理的电商场景,也有很多内容适合跨端。
@@ -185,25 +185,25 @@ JS UI框架采用类HTML和CSS Web编程语言作为页面布局和页面样式
1. 双端基础组件设计规则对齐(对前端来说是同类组件API、属性对齐以及组件功能形态映射)
-
+
Select对应Picker
1. 布局响应规则(行列变化,聚合变化等);
-
+
卡片布局的一种聚合变化
1. 交互形态响应规则(导航、交互模式等);
-
+
表单型弹窗对应新页面
1. 不同场景的跨端策略,例如Dashboard页面的跨端应保证用户在首屏快速获取关键信息,下图的Bootstrap模板是一个错误示例,移动端的布局方式浪费首屏空间,降低用户获取关键信息的效率。
-
+
Mobile first 不是唯一准则。进行具体场景的跨端设计时,我们会从两端场景出发重新对比分析用户的需求差异,明确体验的增强点与折损点。特别是电商中后台场景中:有些业务中用户的主阵地并不是在移动端,而是PC端,比如用户运营策略的设置;有些是两端分别承载不同的场景需求,比如任务的处理。
@@ -217,7 +217,7 @@ Mobile first 不是唯一准则。进行具体场景的跨端设计时,我们
Serverless字面意思是无服务,但并不代表再也不需要服务器了,而是指开发者不需要过多的考虑服务器的问题,计算资源作为服务出现而不是服务器的概念出现。 那么Serverlss,是对全部底层资源和操作的封装,让开发者专注于业务逻辑。
-
+
Serverless = Faas (Function as a service) + Baas (Backend as a service)
@@ -254,7 +254,7 @@ Serverless 带来的其实是前端研发模式上的颠覆。相对以往纯前
- 无需在代码内考虑高并发高可靠性,可以专注于业务
- 通过云函数实例的高并发能力,实现业务高并发
-
+
#### 自动弹性压缩
@@ -281,7 +281,7 @@ uni-app 是一个使用 Vue.js 开发所有前端应用的框架,开发者编
- 在Android平台,将.uts文件编译为kotlin代码
- 在iOS平台,将.uts文件编译为swift代码
-
+
1. 区分页面和组件的区别:页面和组件的生命周期
2. 云函数、云数据库
@@ -298,12 +298,12 @@ uni-app 是一个使用 Vue.js 开发所有前端应用的框架,开发者编
1. Frameless:桌面端不仅仅只有方框矩形,而是想你所想。
-
+
## 参考作业
尝试使用某种跨端框架和云函数,实现一个查看课表应用,形式不限。推荐使用hdu-lis包拿到数据。
-
+
diff --git a/7.网络应用开发/7.1WEB开发入门.md b/7.网络应用开发/7.1WEB开发入门.md
index e675321..8c41223 100644
--- a/7.网络应用开发/7.1WEB开发入门.md
+++ b/7.网络应用开发/7.1WEB开发入门.md
@@ -107,7 +107,7 @@ A:理论上可以。但一般不会这么做(除了一些实时的网络聊
登登登,后端登场!
-
+
解释一下:
diff --git a/README.md b/README.md
index c002acb..6d2d40e 100644
--- a/README.md
+++ b/README.md
@@ -1,5 +1,5 @@
-

+
HDU计算机科学讲义
@@ -51,7 +51,7 @@
zzm 花费了一年的时间动员了大伙对讲义进行修缮和完备,不得不说这确实不是一个小的工作,不过在2023年3月,在计院领导的支持下,计算机学院科协成立了。我们将在学院的支持下继续完善这个内容,同时也欢迎大伙加入我们,共同参与到讲义的学习与撰写中来!
-

+
## 学习原则
diff --git a/components/Parallax.vue b/components/Parallax.vue
index 9056c31..4f135e3 100644
--- a/components/Parallax.vue
+++ b/components/Parallax.vue
@@ -39,13 +39,13 @@ const containerStyle: CSSProperties = {
const layer0 = computed(() => ({
...layerBase,
- content:'url(https://pic-hdu-cs-wiki-1307923872.cos.ap-shanghai.myqcloud.com/hdu-cs-wiki_main.png)',
+ content:'url(https://cdn.xyxsw.site/hdu-cs-wiki_main.png)',
transform: `translateX(${parallax.tilt * 10}px) translateY(${parallax.roll * 10
}px) scale(1)`,
}))
const layer1 = computed(() => ({
- content:'url(https://pic-hdu-cs-wiki-1307923872.cos.ap-shanghai.myqcloud.com/sparkles.gif)',
+ content:'url(https://cdn.xyxsw.site/sparkles.gif)',
userSelect: 'none',
"-webkit-user-drag": "none",
transform: `translateX(${parallax.tilt * 20}px) translateY(${parallax.roll * 20
diff --git a/wiki史.md b/wiki史.md
index bacff61..f36c150 100644
--- a/wiki史.md
+++ b/wiki史.md
@@ -32,7 +32,7 @@
在那一轮培训的过程中,晓宇来改作业,我来组织大伙开会和讲一些内容,我们看着很多原本电脑都不会用的同学有机会能接触到世界相较而言很前沿的任务,心里还是很有成就感的。
-
+
(图一:最早的SRT社团培训)
@@ -60,20 +60,20 @@
于是我当时的计划是,先尽自己所能,将自己在学习过程中踩得坑,走的错误道路都记录下来,然后借鉴南京大学和上海交大的思想,先写一些有指导意义的软文,然后把自己学的 AI 和编程的内容写下来,并且吸取一些国外优质的课程内容。争取做一些更新手友好的内容。写了两个月,将 AI 和编程部分自己的入门经验写出来了,估计输出了数万字。
-
+
(早期Wiki)
不过问题很快暴露出来,我作为一个个体是渺小且无力的,而计算机科学的世界是宏伟且庞大的,凭借我一个人,我这辈子写完是没戏了。不过没关系,我在冥冥之中仿佛与战国时期翻手为云,覆手为雨的纵横学家有了心灵感应,是时候发动人民群众的力量了!
在新生到来前的那个暑假,我先后联系了杭电技术最强的几个技术团体的同学,一起参与到 Wiki 的完善工作去,尽可能补齐计算机技术的方方面面,甚至我们找到了杭电最受欢迎的老师之一韩健夫老师为我们写了一篇文章。随着 22 届新生的到来,Wiki 已经初具雏形了,我们依靠新生的反馈,循序渐进地修改内容,并且鼓励新生可以根据自己的学习心得对 Wiki 进行修正。
-
+
(图三:超大规模的22届)
在这个时候,我觉得也许仅仅靠校内的视角,是远远不够的,我们需要一些更为先进的生产力的帮助!这个时候我想到了之前看到过的 Datawhale 的教程,于是我去联系了他们的开源项目负责人和创始人,甚至去了他们在杭州的总部。
-
+
在与他们的沟通过之后备受振奋,有种酒逢知己千杯少的快乐,感觉 Datawhale 这样的社区就是一群我这样的聚集在了一起。我们的理念和思考完全相同,并且他们传递给了我一种力量,一种可以让理想真正落地的力量,一种靠人与人之间互相关怀,互相帮助,通过信任和感情把大伙联系起来。
diff --git a/简介.md b/简介.md
index c90c8aa..2145990 100644
--- a/简介.md
+++ b/简介.md
@@ -31,7 +31,7 @@
想必在这里,你或多或少都能得到自己的答案!
-

+
欢迎加群与学长交流!我们也可以针对你的喜好为你定制一个方案!