首页 > 编程知识 正文

ctfwiki,格式化字符串漏洞

时间:2023-05-05 03:52:54 阅读:286424 作者:1957

看过ctfwiki格式化字符串部分,把遇到的疑惑的理解记录下来

首先是偏移

拿改栈上一个参数的值为例,更改我们的输入
我起初不懂为什么会有这个偏移,看wiki说的我以为是简单的入栈顺序造成的,后来看了这个才知道为什么有这个偏移,简单来说就是,例如

char a[100]; scanf("%s",a); printf(a);

这里输入a时是把栈上a的值给替换成输入的值,这个栈指的是main函数的栈,因为a是mian函数的局部变量,然后就又有printf函数的调用,这时printf函数的栈在a栈桢的上面,然后printf入栈的参数是a的地址,在这里就有了偏移,我们要改的不是printf入栈的那个参数,那个只是地址,改了之后只是不对应a了,对a真正的值没影响,我们要改的是a,也就是在这个函数的栈里去修改别的函数的栈的内容,我们要计算printf函数入参的那个栈桢相较a变量存的栈桢的差,这是偏移的原因

为什么想覆盖的地址可以放payload前也可以后

理解上面的偏移之后这里就不难了,首先一点是在前在后的时候对应的要覆盖的地址不同,偏移不同,在前那就是偏移小点,在后的话,payload前面的内容把本该在第一个栈桢的要修改的值挤到了下面的栈桢里,所以偏移要适当添加,而且这时在%k%n后面与地址之间也有必要填充,凑够4或8对齐,理解上面的偏移之后这点不难

got表改地址

起初迷惑为什么有了

elf = ELF('./pwn')puts_got=elf.got['puts']

之后还要泄露地址才能得到puts的地址用来查libc,后来明白elf.got得到的是got表中的内容,对应的是puts函数的地址的地址(这么说好像也不对),反正就是got表得到的并不是我们想要的,我们需要把这个值入栈,作为地址,利用格式化字符串来获得把这个值作为地址得到的值,那个才是真正的puts函数地址,才能用来查libc

用ebp的值得到返回地址

就是wiki里hijack retaddr部分,非要先用格式化字符串偏移为6得到ebp的值,然后再用这个值和返回地址所在栈桢的差值来算出返回地址,而不是直接用偏移为7获得,后来明白,我们需要的不是这个返回地址本身,我们要的是返回地址的地址,因为我们要改返回地址,所以知道了返回地址在哪后就能把这个地址的值改变,只知道原返回地址做不到这一步

版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。