buuctf之pwn1_sctf_2016

本文详细描述了一次对x86架构32位ELF程序的漏洞分析过程,包括静态分析中的函数理解、动态分析中的栈空间观察,最终通过计算确定并利用了溢出漏洞进行旗标提取。
摘要由CSDN通过智能技术生成

一、查看属性

首先还是必要的查看属性环节:

可以知道该文件是一个x86架构下的32位小段ELF程序

我们可以先执行一下看看:

二、静态分析

扔到IDA中看一下,主函数没什么用,这里的vuln函数是必进的,我们进去看看vuln函数

这个函数整体分析下来,我也看不太明白是干啥,看到了fgets函数,但是限制了输入长度,洞肯定不在这里,后面又看到了“I”和“you”和一个replace函数,和最后的strcpy函数基本能猜到怎么利用了

我们猜测他会把“I”变成“you”,我们跑一下看看确实是这样

接下来,我们静态找找有没有给可以利用的函数:

获取其地址0x8048f0d

同时在当前目录下写一个flag.txt

三、动态分析

我们把断点打在vlun函数里:

单步到fgets函数随便输入几个“I”,之后一直步过到strcpy函数

步过之后我们查看栈空间:

可以看到ret地址在0xffffd16c,而stacpy函数操作的局部变量在0xffffd12c

说明我们需要64个垃圾数据

四、漏洞利用

这里我们整理一下思路:

我们输入的其它字符只占一个字节,而我们输入的“I”经过replace函数后会变成“you”也就是放大了三倍,我们的输入只有31个字节,而我们需要64位的填充数据

综上,可列出方程组如下:

这里的x是“I”的个数,y是“a”(其它字符)的个数,4是我们的溢出地址32位程序是4字节

解得x>=18.5,所以我们取x=19,也就是19个“I”和64 - 19*3=7个“a”

所以我们可以得到我们的exp:

from pwn import *

io = process('./pwn1_sctf_2016')

flag_addre = 0x08048F0D
payload = 'I' * 19 + 'a' * 7 + p32(flag_addre)
io.sendline(payload)
io.interactive()

成功!!!

  • 23
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值