ps:在西电终端复盘时发现的一个自己的很弱智的错误:用websocket连接时,忘记修改返回netcat的ip设置导致使用的是127.0.0.1:本机回环地址,只能在本机使用。所以一直无法连接上有线环境而用wscat进行连接,结果就是nc没搞明白,一直以为是自己的问题。修改成192.168.77.1,就可以连接上了。
下载之类的在这里就先不提了,相信很多人在刚开始学的时候会因为没有引导和庞大的信息量而不知所措,之后我会边学边试着整理一些pwn和re的学习笔记,早期写好的博客有一些可能不会放过来,有兴趣的也可以留言讨论。
使用pwntools连接:
做pwn题过程中,有时会有需要发送一些特殊数值,这些数值无法使用键盘输入,又或是需要填充大量 的字符,这时就需要使用脚本来代替我们发送payload。 常用的pwn工具库就是pwntools,是一个python库。这个库既可以在本地启动进程来调试攻击脚本,又 可以连接远程服务器进行攻击。
我们可以在本地调试:
|
|
远程连接与攻击:
|
|
pwntools的一些常用发送函数:
send(str: byte) # 仅仅将str发送出去
sendline(str: byte) # 在str后面加一\n再发送
sendafter(str1: byte, str2: byte) # 后面两个函数在接收到str1后,再发送str2,发送
部分和上面两个一样,我比较习惯用下面的sendlineafter函数
sendlineafter(ste1: byte, str2: byte)
字节串:
- 字节串的定义 字节串通过在字符串前加上小写字母 b 来定义,例如: python
|
|
recvuntil函数:
用法:recvuntil函数通常需要指定一个套接字作为输入参数,以及一个分隔符或长度作为接收数据的终止条件。例如,recvuntil(sock, ‘AAA’)会从套接字sock中接收数据,直到接收到字符串AAA为止。 怎么用呢?我们可以用recvuntil函数来接收数据,直到接收到分隔符为止。这在某些pwn题中运行脚本很有用
recvline函数方法:
.recvline() 方法 recvline() 方法用于从目标程序(如远程服务、管道、或本地进程)接收一行数据,并且自动处理行的结束符(例如换行符 \n)。这对于读取包含换行符的响应非常有用,因为它可以确保你接收到的是完整的一行数据,而不是部分数据。 具体来说,recvline() 会: 从连接中接收数据,直到遇到换行符(\n)为止。 返回接收到的数据(去除换行符)。
cyclic函数方法:
cyclic() 的作用 cyclic() 函数会生成一个包含连续递增字节的字节串,常常用于模拟程序的输入,以确定溢出发生的位置。这个字节串的模式是非常特殊的,通常包含了易于辨认的递增字节,可以帮助攻击者找到覆盖返回地址所需的精确字节偏移量。
如何使用 cyclic() cyclic() 生成的字节串是为了帮助你 确定栈上的溢出偏移量,通常与其他攻击步骤(如定位返回地址)结合使用。
|
|
确定溢出偏移量 通常,cyclic() 用于测试缓冲区溢出时,帮助攻击者确定溢出发生的确切位置。
假设你有一个程序,在接收输入时,程序会在栈上分配一个缓冲区。如果你向这个缓冲区发送的数据超出了缓冲区的大小,它就会覆盖栈中的其他数据,尤其是 返回地址。通过观察溢出的数据,你可以确定栈上溢出发生的位置。
比如,程序的缓冲区大小为 100 字节,而你希望覆盖 返回地址(通常是紧随缓冲区之后的位置)。你可以先发送一个由 cyclic() 生成的 100 字节的字节串,程序崩溃时,gdb 调试器会帮助你分析溢出发生的位置。