基础溢出:

常见的就是shellcode和Rop技术

HTTP协议:

http是一种超文本传输协议,是web上进行任意数据交换的基础,也是一种客户端-服务器协议。

它由请求和响应组成,三部分:请求行,消息报头,请求正文。

请求行:
1
Method Request-URI HTTP-Version CRLF 
消息报头:

包含各个字段,通常以key: value格式表示:

1
2
Content-Length: 348
Content-Type: application/x-www-form-urlencoded
请求正文:

HTTP请求正文是请求消息中可选的部分,通常用于在 POSTPUT 或其他需要传递数据的请求中,携带客户端向服务器发送的数据。它是位于请求头之后的实际数据内容。可由多种数据组成,如表单、二进制、JSON等,如

1
2
3
4
5
6
7
8
9
10
POST /api/v1/user HTTP/1.1  # 请求行
Host: api.example.com # 消息报头(开始)
Content-Type: application/json
Content-Length: 55 # 消息报头(结束)

{ # 请求正文(开始)
"username": "admin",
"password": "12345",
"remember_me": true
} # 请求正文(结束)

Content-Type来判断请求正文的格式,JSON格式的内容则是请求正文

MIPS架构:

寄存器

1
2
3
4
5
6
7
8
9
10
11
zero -> 值始终为0
$at -> 保留给汇编器
$v0-$v1 -> 保存表达式返回结果
$a0-$v3 -> 函数参数,类比rdi,rsi...的顺序,超过4个则用堆栈传递
$t0-t9 -> 临时寄存器,其中t8,t9是扩展,且t9常用来调用函数
$s0-$s7 -> 保存寄存器,保存一些函数调用时必要的值
$k0-$k1 -> 留给系统中断处理的时候使用
$gp -> 全局指针
$sp -> 堆栈指针,类比rsp
$fp -> 栈帧指针
$ra -> 返回地址,类比ret

基础汇编

LOAD和STORE
1
2
3
4
5
6
7
8
l==>LOAD
s==>STORE
不同的后缀代表不同的数据大小
w==>word
h==>half
b==>byte
u==>unsigned
i==>immediate
指令格式
R型
1
opcode | first source res | second source res | destination res | offset | funct(这个参数不用了解,毕竟我们看的常常是汇编)
I型
1
opcode | source res | destination res | addr_offset
J型
1
opcode | target_addr
常见汇编
1
2
3
add
jr==jmp,常跟ra
jalr,效果近似于jmp,后边常跟t9调用函数

流水线指令集特性之一:分支延迟效应

流水线效应最常见的就是跳转指令(如jalr)导致的分支延迟效应,当它跳转指令填充好跳转地址但尚未跳转过去时,它会优先执行该跳转指令的下一条指令,如

1
2
jalr    $t9
addiu $s0, 1

在还未跳转到t9时,会执行addiu汇编,然后再进行跳转,可以理解为同时执行了两条指令