最近省赛要开始了,把去年的题目重新详细的做一遍 较为简单
借鉴了csdn大佬的博客
栈溢出后多个地址和参数的排列顺序的规则
1 | 以一个简单的函数为例 |
1 | 在调用函数的时候,要传入的参数会放在RET之下,也就是主函数的栈空间的顶端。并且参数是根据调用的顺序依次向下排序的,也就是越早用到越上面。 |
1 | 就一个NX(栈不可执行),另外还给了libc.so.6,应该是用ret2libc |
1 | 溢出点很明显因为是32位的程序,payload填充84+4个字节就能完成溢出 |
exp
1 | from pwn import * |
format
1 | 最基本的格式化字符串溢出 |
1 | 1、利用格式化漏洞覆盖任意地址的值,这里我们需要覆盖secret的值,所以先要找到secret的地址,在IDA中,可以看到secret在bss段: |
1 | 2、利用%k$n(k$用于获取格式化字符串中的指定参数)对指定地址进行覆盖 |
1 | 然后运行,提示输出后,我就随便输入一个 %d%d |
1 | 观察栈中的信息 |
1 | 可以看出,printf的第一个参数(format)地址为:0xffffd920 |
exp
1 | from pwn import * |