PWN动态调试1.1版

这篇文章就是来教大家学习怎么动态调试的,然后我还写了一篇关于动态调试的文章,不是buu上面的题,就是两道简单的栈溢出问题,那两道题挺有特点的。大家可以去看看。

每日3道PWN之课外2道(第2.5天)-CSDN博客

先找一个简单的jarvisoj_level0调试一下,然后咱再看复杂的pwn1_sctf_2016

听说又不考pwn了,所以只写完了jarvisoj_level0,现在我就转行去学逆向了

so,停工了~~~私密马赛!

要求环境gdb和pwotool+pwndbg

jarvisoj_level0

先回忆一下

进去后按f5,查看反编译的代码

看一下vulnerable_function这个函数

找后门shift+f12

双击跟进

记录地址0x40059A

大概回忆起来了吧,就是read溢出,做题思路我的另一个博客写过,大家可以去看,

每日3道PWN(第二天)-CSDN博客


动态调试

现在我们进行动态调试

动态分析的正常流程,gdb打开文件

查看变量大小的两种方法

方法1(常规大main的断点+老老实实的查看)

b main 设置断点

阿这,他说我权限不够,稍等我一下哈,先chmod +x level0一下

然后再来一遍,run一下,我们就能看见main函数的汇编和栈什么的

下面这张不是本题的图,但是有结构大概解释

注意:asm的英文就是汇编的意思,registers是寄存器的意思,stack是栈的意思

看见漏洞函数了,为什么知道他是漏洞函数,当然因为前面我都博客里IDA静态分析过了~

而且这个函数的中文意思就是易受攻击的函数

我们就一直输入n,然后知道绿色的箭头指到漏洞函数vulnerable_function

按s,s就是step,si单步步进,进入该函数里面,看见了吧,漏洞利用点,read函数

tips:fini是退出当前函数,r是重新运行,如果弄错的,可以试试这两个

stack 24 命令查看当前栈的前24个栈帧

为什么要stack 24呢

我们的目的,就是查看当前变量buf的大小,前提就是要进入该函数内,就是n一直下一步,直到指向函数之后,输入s,单步进入函数,才能看见变量buf。所以要stack

然后为什么24,听我的大佬说,不管输入几,目的只要看见ebp或者rbp就算可以了,然后我们就用ebp(或者rbp)的地址减去eax(或者rsi)的地址,来计算变量的大小

这里是rbp的0x7fffffffdfb0减去rsi的0x7fffffffdf30

就像这样

咱直接看后两位相减就行,也就是0xb0-0x30=0x80=128

大小0x80,我们去看看对不对

对的。木的问题

vmmp

使用vmmap直接查看该进程的内存空间,不知道有啥用,晚点问问大神

他说,主要就是用来看执行权限的,看rwxp这个权限的,看有没有ASRL漏洞或者其他的


方法2(断点的其他方式)没成功

参考

栈溢出学习_loglevel:'debug-CSDN博客

cyclic这个工具,pwntools自带的一个东西

常用的作用有两个:

  1. 寻找偏移量(Offset):当你想要利用栈溢出等漏洞时,通常需要知道目标程序中栈上缓冲区的偏移量,以确定准确的覆盖位置。使用"cyclic"工具可以生成一种重复的模式,并将其发送给目标程序,然后在程序崩溃时,通过查找崩溃时覆盖的位置,就能够计算出偏移量。

  2. 覆盖返回地址:在进行栈溢出漏洞利用时,通常需要将恶意代码的地址写入到返回地址中,从而实现控制程序流程的目的。使用"cyclic"工具可以生成指定长度的重复模式,并将其作为返回地址,使程序跳转到我们控制的位置。

寻找偏移量,以下是实例代码:

from pwn import *

pattern = cyclic(100)  # 生成长度为100的重复模式,就相当于b'A'*n
print(pattern)

# 在漏洞利用中发送模式给目标程序
p = process('./vulnerable_program')
p.sendline(pattern)
p.recv()  //接受数据的意思,就是有时候他会有一个提示的字符串,需要你先进性接收
p.close() //关闭接受的意思

# 漏洞触发后,获取返回地址所在的偏移量
offset = cyclic_find(packed_address)  # packed_address为返回地址
print(offset)

然后我要讲的是gdb中cyclic的使用,目标是0x80=128,可以多一点,进行溢出,也可以刚刚好等于128

这里生成128位垃圾数据,一会直接拿来复制粘贴

这次也再学习以下打断点的其他方式

先去IDA中查找漏洞利用函数的地址,我们打地址的断点

先找到漏洞利用的read函数

然后右键选择copy to assembly(复制到程序集的意思,咱也不知道程序集是啥意思,但作用把每一行源代码就是编译成成汇编码,并进行注释说明)

call的汇编码意思是函数的意思,后面还有read字样

那就是他了,记一下地址0x4005bf

gdb打断点去

tip:对了,断点就是让程序运行道某给位置后停止,然后一步一步进行,是为了让程序员调试用的

打断点b *地址,别忘了*

然后我们在n的时候,就直接让我们输入东西了

找到栈,找道地址0x7fffffffdf30

然后用cyclic

或者当时直接这样查看

跟着博主没成功,私密马赛,学艺不精

pwn1_sctf_2016(未整理)

### 检测 Struts2 框架中的反序列化漏洞 Struts2 框架的反序列化漏洞是由于框架在处理用户输入时未能正确校验或限制反序列化的数据,导致攻击者可以利用恶意构造的数据执行任意代码。以下是一些检测和验证 Struts2 中是否存在反序列化漏洞的方法。 --- #### 1. **检查请求头或参数中是否存在可疑的序列化数据** 在 HTTP 请求中,反序列化漏洞通常会表现为特定格式的二进制数据。例如,在 Java 反序列化过程中,数据通常以 `AC ED` 开头,并包含本号(通常是 `00 05`)[^3]。可以通过抓包工具(如 Burp Suite、Wireshark)来分析请求内容: - 使用 Burp Suite 抓取请求后,在 Hex Editor 插件中查看请求体是否以 `AC ED` 开始。 - 如果发现此类数据,则可能是潜在的反序列化攻击尝试。 --- #### 2. **日志文件分析:识别异常访问行为** 通过分析 Tomcat 或其他 Web 容器的日志文件,可以发现可疑的访问模式。例如: - 是否有大量 POST 请求访问 Struts2 的页面。 - 是否存在与反弹 Shell 相关的行为,比如访问 `/struts2-showcase/` 等测试页面。 - 日志中是否记录了异常的错误信息,例如 `java.io.StreamCorruptedException` 或 `Invalid stream header` [^1]。 如果发现异常 IP 地址频繁访问某些特定的 Struts2 页面,应进一步调查其请求内容。 --- #### 3. **使用工具进行漏洞扫描** 可以使用一些专业的漏洞扫描工具来检测 Struts2 应用程序是否存在反序列化漏洞: - **Burp Suite Pro**:内置的 Active Scanner 可以检测 Struts2 的常见漏洞,包括反序列化问题。 - **Nessus** 或 **OpenVAS**:这些网络扫描工具支持对 Web 应用进行自动化漏洞检测。 - **专门针对 Struts2 的工具**:例如 `struts-pwn`,它专门用于检测 S2-048 等 Struts2 漏洞 [^2]。 --- #### 4. **手动复现漏洞测试** 如果你拥有目标系统的权限,可以通过手动构造请求来测试是否存在反序列化漏洞。以下是基于 S2-048 漏洞的示例: ```http POST /struts2-showcase/actionChain1.action HTTP/1.1 Host: target.com Content-Type: application/x-www-form-urlencoded name=%{#a=(new java.lang.ProcessBuilder(new java.lang.String[]{"whoami"})).start()} ``` 该请求尝试通过 OGNL 表达式注入执行系统命令。如果服务器返回了 `whoami` 的结果,则说明存在反序列化漏洞 [^4]。 --- #### 5. **代码审计:检查反序列化调用点** 如果能够访问源代码,可以搜索以下关键字: - `readObject` - `ObjectInputStream` - `deserialize` 在 Struts2 框架中,反序列化操作可能出现在自定义的 Action 类中,或者在处理上传文件的过程中。例如: ```java public class DeserializeAction extends ActionSupport { public String execute() throws Exception { ObjectInputStream ois = new ObjectInputStream(new FileInputStream("data.ser")); Object obj = ois.readObject(); // 存在反序列化漏洞风险 return SUCCESS; } } ``` 如果发现未对反序列化对象进行类型校验,则可能存在漏洞 [^3]。 --- #### 6. **防御措施建议** - **升级 Struts2 本**:确保使用的是官方推荐的安全本(如 Struts 2.5.x 以上)。 - **禁用不必要的功能**:关闭调试模式、禁用动态方法调用等。 - **过滤特殊字符**:对用户输入进行严格的白名单过滤。 - **使用安全库**:例如 Apache Commons IO 提供的 `ObjectInputStream` 替代方案,防止反序列化攻击。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值