HUGEMESS
word
| Name | Full Name | Bytes | Bits |
|---|---|---|---|
| Byte | Byte 字节 | 1 | 8 |
| Word | Word 字 | 2 | 16 |
| Dword | Double Word | 4 | 32 |
| Qword | Quad Word | 8 | 64 |
神秘任务
知道在哪里获取libc的源码,并能在gdb中显示
在 gdb 中,直接 x/128i *malloc 就可以输出一个函数的源码
但是好像“并能在gdb中显示”并不是这个意思…但是我也不知道是什么意思(x
知道gnu coreutils中每个工具的作用(不需要掌握使用方法)
看了眼大部分已经再用了,不熟的只有下面四个:
- sort 对文件内容行排序
- cut 对文本列切分
- date 显示时间
- du 查看文件的磁盘占用情况
小应用:ls -la | tr -s ' ' | cut -d ' ' -f 9 | sort 输出当前文件夹按照字典序排列的文件名。
学会使用docker拉取镜像,并能从中只复制出libc文件
还没学会
linux 文件系统
- ‘/’ :根目录
- ‘/home’:相当于win所有用户的desktop
- ‘/bin’:一些二进制可执行文件
- ‘/sbin’:管理员使用的与系统相关的可执行文件
- ‘/etc’:系统配置文件,相当于win注册表
- ‘usr/bin’:用户的一些可执行文件,不会受到系统自动更新的影响,与
/bin都会加入环境变量,但优先级更高 - ‘/dev’:设备文件。linux 将许多东西映射成文件的形式,在 ‘/dev’ 中存放了许多设备和系统提供的功能接口
- ‘/root’:root 的 home
- ‘/tmp’:临时文件目录,系统重启时通常会清空
setvbuf()
setvbuf 是 C 语言中用来 控制文件流(Stream)缓冲区 的函数。
extern int setvbuf (FILE *__restrict __stream, char *__restrict __buf,
int __modes, size_t __n) __THROW;__stream:文件指针__buf:缓冲区地址(一般传入NULL让系统自己分配)__modes:缓冲模式__n:缓冲区大小
#define _IOFBF 0 /* Fully buffered. */
#define _IOLBF 1 /* Line buffered. */
#define _IONBF 2 /* No buffering. *//dev/urandom
随机数接口,通过收集计算机运行时的“环境噪声”来生成随机性。这些噪声包括硬件中断的时间、磁盘寻道时间、键盘敲击间隔等。
与 /random 的区别在于如果系统收集的噪声不够多也会立刻计算出随机数。
read()
ssize_t read(int fd, void *buf, size_t count); // buf:where the data stored返回值大于 0 表示读到的字节数,0 表示到达 EOF,-1 表示发生错误。
srand()
设置随机数种子。
__readfsqword()
字面意思,read from stack qword
v3 = __readfsqword(0x28u);
...
return __readfsqword(0x28u) ^ v3;这段即检查 canary。
atoi()
ascii to integer
checksec
我服了看一遍忘一遍 记一下。
Arch: amd64-64-little
RELRO: Partial RELRO
Stack: Canary found
NX: NX enabled
PIE: No PIE (0x400000)
Stripped: NoArch:架构 这里是 64 位 小端序,小端序就是低字节存在低地址RELRO:RELocation Read Only,这里部分开启,说明 GOT(Globe Offset Table) 可写,比如可以把puts的地址改成system的Stack:Canary。NX:No Execute,数据段不可执行,包括栈PIE:Position Independent Executable,地址随机化,此例没开启,函数地址不会改变。- Stripped:是否删除符号表,这里没有,说明函数名变量名都可以在反编译中看到。
神秘眼瞎
*(_QWORD *)b1 = 0x695420796E6E6954LL;看清楚类型,这里并非修改 b1 的值指向 0x69 一大串,而是修改 *b1 处的值。
实际上一大串是一个字符串,在 ida 中按 R 即可将其尝试改为字符串显示。
*(_QWORD *)b1 = 'iT ynniT';解压 zip
linux 解压 zip,使用 unzip,unzip foo.zip -d /fold
patchelf
使用 patchelf 更改可执行文件的 libc 和动态链接器
# 1. 设置动态链接器
patchelf --set-interpreter ./ld-linux-x86-64.so.2 ./bss_fmt
# 2. 设置 libc 查找路径,.表示在当前目录寻找 libc.so.6
patchelf --set-rpath . ./bss_fmtfgets()
char *fgets(char *str, int n, FILE *stream)从 stream 中读取一行存入 str,最多 n 字符(包括 \0)。
传参顺序
`rdi`、`rsi`、`rdx`、`rcx`、`r8`、`r9`查看栈帧
pwndbg 中 stack n 来显示 n 行的当前栈帧。
fs:[0x28]
mov rax, qword ptr fs:[0x28]fs 是段寄存器,指向 TLS 基地址,此处取出了操作系统生成的随机 64 位数值,用于 Canary。
HUGEMESS
https://ybwa.github.io/p/cbea68d7/