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)缓冲区 的函数。

CODE

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:   No
  • Arch:架构 这里是 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,使用 unzipunzip 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_fmt

fgets()

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。