PWN PWN PWN !!! 技巧 (4)
简介:
紧接上述技巧(1)、技巧(2)和技巧(3),这次总结一些常用的命令、重定向和一些整数溢出需要了解的知识点,还有一些接收发送的命令。
shell命令
(1)$IFS$1
它是一个 shell 变量,用于定义分隔符来进行单词分割。$1 是 shell 脚本中的位置参数,表示第一个参数。
(2)tac${IFS}f*
tac${IFS}f* 是一个 shell 命令,它使用 tac 命令来反向连接文件。${IFS} 表示 IFS 变量的值,它用于在 tac 和 f* 之间添加分隔符。f* 是一个文件名模式,表示当前目录中以 f 开头的所有文件。
(3)nl${IFS}f*
nl${IFS}f* 是一个 shell 命令,它使用 nl 命令来为文件添加行号。${IFS} 表示 IFS 变量的值,它用于在 nl 和 f* 之间添加分隔符。f* 是一个文件名模式,表示当前目录中以 f 开头的所有文件。
因此,这个命令的作用是为当前目录中以 f 开头的所有文件添加行号。
(4)tail ./*
tail ./* 是一个 shell 命令,它使用 tail 命令来显示文件的最后几行。./ 表示当前目录,* 是一个通配符,表示当前目录中的所有文件和目录。
因此,这个命令的作用是显示当前目录中所有文件的最后几行。默认情况下,tail 命令显示每个文件的最后 10 行。
(5)重定向组合
exec 1>&0 && tac fl* |
解释见 FSCTF 2023 PWN
重定向
在 Linux shell 中,>&0、>&1 和 >&2 都是重定向操作符,用于将输出重定向到不同的地方:
>&0:这个操作符将输出重定向到文件描述符0,也就是标准输入。然而,这通常没有什么实际用途,因为标准输入通常用于读取输入,而不是写入输出。>&1:这个操作符将输出重定向到文件描述符1,也就是标准输出。这是默认的输出目标,所以你通常不需要显式地使用这个操作符。然而,在某些情况下,你可能会想要将错误输出重定向到标准输出,那么你可以使用2>&1。>&2:这个操作符将输出重定向到文件描述符2,也就是标准错误输出。这通常用于输出错误信息。例如,如果你有一个命令可能会产生错误,你可以使用这个操作符将错误信息重定向到一个文件,如:command 2> error.txt。
常见示例:
exec 1>&0 |
它将标准输出(文件描述符 1)重定向到标准输入(文件描述符 0)
整数溢出
整数溢出是指在计算机中对整数类型进行运算时,结果超出了该类型所能表示的范围。
| 类型 | 范围 | 占用字节 |
|---|---|---|
char |
-128 ~ 127 | 1 字节 |
unsigned char |
0 ~ 255 | 1 字节 |
short |
-32768 ~ 32767 | 2 字节 |
unsigned short |
0 ~ 65535 | 2 字节 |
int8 |
-128 ~ 127 | 1 字节 |
uint8 |
0 ~ 255 | 1 字节 |
int16 |
-32768 ~ 32767 | 2 字节 |
uint16 |
0 ~ 65535 | 2 字节 |
int32 |
-2147483648 ~ 2147483647 | 4 字节 |
uint32 |
0 ~ 4294967295 | 4 字节 |
int64 |
-9223372036854775808 ~ 9223372036854775807 | 8 字节 |
uint64 |
0 ~ 18446744073709551615 | 8 字节 |
long32 |
-2147483648 ~ 2147483647 | 4 字节 |
ulong32 |
0 ~ 4294967295 | 4 字节 |
long64 |
-9223372036854775808 ~ 9223372036854775807 | 8 字节 |
ulong64 |
0 ~ 18446744073709551615 | 8 字节 |
/1.png)
Pwntools
利用 pwntools 工具来接收发送数据,在做题的时候我认为还是非常重要的,所以记录一手,大家一起共勉_
发送数据
p.send(data) # 发送数据 data |
接收数据
p.recv(n) # 接收指定 n 字节 |
示例:如何接收到 0x4038f64e0f1c4200
/2.png)
num = int(p.recv(18), 16) |
p.recv() 和 p.recvn() 有什么区别
/3.png)
32 位如何接受字符串
/4.png)
num = u32(p.recvuntil(b'\xf7')[-4:]) |
/5.png)
64 位如何接受字符串
/6.png)
num = u64(p.recvuntil(b'\x7f')[-6:].ljust(8, b'\x00')) |
/7.png)
Fmtstr
fmtstr_payload(offset, {address:data}, numbwritten=0, write_size='byte') |
offset:格式化字符串偏移numbwritten:已经输出的字符数write_size:写入方式(byte=hhn,short=hn,int=n),默认为byte
注意:部分题目限制时间,pwntools 生成的 payload 可能失效。 可通过修改低地址等方式减小输出长度,需手动构造 payload。
总结:
多做多总结,慢慢的要开始进攻堆了,加油加油,冲冲冲!!!