LOADING

加载过慢请开启缓存 浏览器默认开启

PWN PWN PWN !!! 技巧 (4)

2023/10/29 技巧 PWN

PWN PWN PWN !!! 技巧 (4)

简介:

PWN PWN PWN !!! 技巧 (1)

PWN PWN PWN !!! 技巧 (2)

PWN PWN PWN !!! 技巧 (3)

紧接上述技巧(1)、技巧(2)和技巧(3),这次总结一些常用的命令、重定向和一些整数溢出需要了解的知识点,还有一些接收发送的命令。


shell命令

(1)$IFS$1

它是一个 shell 变量,用于定义分隔符来进行单词分割。$1 是 shell 脚本中的位置参数,表示第一个参数。

(2)tac${IFS}f*

tac${IFS}f* 是一个 shell 命令,它使用 tac 命令来反向连接文件。${IFS} 表示 IFS 变量的值,它用于在 tacf* 之间添加分隔符。f* 是一个文件名模式,表示当前目录中以 f 开头的所有文件。

(3)nl${IFS}f*

nl${IFS}f* 是一个 shell 命令,它使用 nl 命令来为文件添加行号。${IFS} 表示 IFS 变量的值,它用于在 nlf* 之间添加分隔符。f* 是一个文件名模式,表示当前目录中以 f 开头的所有文件。

因此,这个命令的作用是为当前目录中以 f 开头的所有文件添加行号。

(4)tail ./*

tail ./* 是一个 shell 命令,它使用 tail 命令来显示文件的最后几行。./ 表示当前目录,* 是一个通配符,表示当前目录中的所有文件和目录。

因此,这个命令的作用是显示当前目录中所有文件的最后几行。默认情况下,tail 命令显示每个文件的最后 10 行。

(5)重定向组合

exec 1>&0 && tac fl*
tac fl* >&0
tac fl* >&2

解释见 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 字节


Pwntools

利用 pwntools 工具来接收发送数据,在做题的时候我认为还是非常重要的,所以记录一手,大家一起共勉_

发送数据

p.send(data)               # 发送数据 data
p.sendline(data) # 发送一行数据 data,加上换行符
p.sendafter(data, payload) # 接收到 data 后发送 payload
p.sendlineafter(data, payload) # 接收到 data 后发送 payload 并换行

接收数据

p.recv(n)                  # 接收指定 n 字节
p.recvn(n) # 接收 n 字符
p.recvall() # 接收所有数据
p.recvline() # 接收一行(到换行符)
p.recvlines(n) # 接收 n 行
p.recvuntil(data) # 接收到 data 为止
p.recvuntil(data, drop=True) # 接收直到 data(如 '\nTell')

示例:如何接收到 0x4038f64e0f1c4200

num = int(p.recv(18), 16)
# 或者:
p.recvuntil(b'0x')
num = int(p.recvline(), 16)
# 或者:
p.recvuntil(b'0x')
puts_addr = int(p.recv(16), 16)

p.recv()p.recvn() 有什么区别

32 位如何接受字符串

num = u32(p.recvuntil(b'\xf7')[-4:])
# 提取后 4 字节
python切片:[-4:],代码可以确保仅提取接收到的数据的最后四个字节,而不考虑数据的前面部分

64 位如何接受字符串

num = u64(p.recvuntil(b'\x7f')[-6:].ljust(8, b'\x00'))
# 或者
num = u64(p.recvuntil(b'\x7f')[:6].ljust(8, b'\x00'))
# 或者
num = u64(p.recv(6).ljust(8, b'\x00'))


Fmtstr

fmtstr_payload(offset, {address:data}, numbwritten=0, write_size='byte')
  • offset:格式化字符串偏移
  • numbwritten:已经输出的字符数
  • write_size:写入方式(byte=hhnshort=hnint=n),默认为 byte

注意:部分题目限制时间,pwntools 生成的 payload 可能失效。 可通过修改低地址等方式减小输出长度,需手动构造 payload。


总结:

多做多总结,慢慢的要开始进攻堆了,加油加油,冲冲冲!!!

⬅ 上一篇
SHCTF 2023 [WEEK 1] PWN
2023-10-31  |  | PWN, SHCTF
下一篇 ➡
NewStarCTF 2023 [WEEK 3] PWN
2023-10-28  |  | PWN, NewStarCTF
0%
Rope Head