stack:局部变量,rbp,返回地址...
heap:通过malloc分配的内存
bss,data:全局变量,字符串...
text:代码段
## x86-64汇编及函数调用约定
- 赋值:mov
- 运算:add, sub, mul, div, and, or, xor, shl, shr, sar
- 比较:cmp
- 栈操作:push, pop
- 跳转:jmp, j[e/ne/z/nz/l/le/g/ge/b/be/a/ae]
- 函数调用与返回:call, ret
- 系统调用:syscall
- 空指令:nop
- 函数传参顺序:rdi, rsi, rdx, rcx, r8, r9, 栈
- 函数返回值:rax
## Review:常见保护措施
- RELRO
- Canary
- NX
- PIE
**如何检测?**
使用pwntools附带的妙妙小工具——checksec
| 函数 | 读取方式 | 停止条件 | 是否保留换行符 |
|:----:|:--------:|:------------:|:---------:|
| **gets** | 从stdin读取 | 遇到换行符或EOF | 不保留 |
| **fgets** | 从指定流读取 | 遇到换行符、EOF或达到size-1 | 保留 |
| **scanf** | 从stdin读取 | 根据格式符决定 | 不保留 |
| **read** | 从文件描述符读取 | 读取count字节或EOF | 保留所有字符 |
## Review:pwntools使用
交互
```python
p = remote("127.0.0.1",1234)
p = process("./pwn")
p.interactive()
p.send("hello")
p.sendline("hello")
p.sendafter("$ ", "hello")
p.sendlineafter("$ ", "hello")
p.recv(1024)
p.recvn(4)
p.recvline()
p.recvuntil(":")
```
调试
```python
gdb.attach(p)
pause()
```
⭐ELF操作及查找
```python
prog = ELF("./pwn")
prog.sym['main']
prog.got['printf']
prog.plt['read']
libc = ELF("./libc.so.6")
libc.sym['gets']
libc.search(b'/bin/sh\x00')
```
## glibc-all-in-one
- 项目地址: