pwn入门笔记(3)——printf漏洞调试

printf

在C语言中,我们经常使用各种函数来进行输出操作
printf,fprintf,vprintf,vfprintf,sprint等,
其中Fomat String是其第一个参数,我们一般称之为格式化字符串

printf 接受变长的参数,其中第一个参数为格式化字符串,后面的参数在实际运行时将与格式化字符串中特定格式的子字符串进行对应,将格式化字符串中的特定子串,解析为相应的参数值。

解析

我们都知道printf在执行的时候,首先进行格式化字符串的解析,,从栈或者寄存器中获取参数并与符号说明相匹配,然后将匹配的的结果输出到屏幕上
如果符号声明和参数不能真缺匹配,比如,参数个数少于符号声明个数的时候,就有可能造成泄露

实例

样例使用上次笔记的

#include
int main()
{
     
    char *name = "Roger";
    printf("My name is %s"); 
    return 0;
}

进gdb
之后disass main
pwn入门笔记(3)——printf漏洞调试_第1张图片
pwn入门笔记(3)——printf漏洞调试_第2张图片
之前ebp-0xc是存储之前的ecx,所以之后才是主函数的开始
所以在下面下断点080484ae
然后直接运行
下一步
之后我们可以看到
在这里插入图片描述
这里已经为之后的输出开始做准备了在这里插入图片描述
这里传过来了一个东西
在这里插入图片描述
也就是我们源码printf那一段
注意:我们的源码后面是没有跟参数的
在这里插入图片描述
参数没有对应的话程序会在原有应该有参数的地方取一个参数过来
之后我们看看函数在这里插入图片描述
它直接就打印出来了
参数的内容是没有给的
但是它会以为我们给了
所以回去esp x4里面取一个
在这里插入图片描述
之后输出esp 这里面的内容
在这里插入图片描述
也就是说我们在输出My name is %s的时候,前面的%s肯定要匹配一个后面的东西的
我们可以在这个地方修改数值,看看它能不能输出我们修改的数值

改变量,我们使用set
在这里插入图片描述
我们可以看到之前我们有一个roger在堆栈里面但是没有用
用用看?
输入

set *(0xffffd514)=0x8048590//我们要改的是里面的内容,直接把地址传过去就行

我们也可以在原来的位置的时候,在0x0输入前,
输入n
之后可以随便输啥
sfnbsfnb都是可以的
字符串就好
之后就变成了
在这里插入图片描述
在这里插入图片描述
值就改变了
之后我们输入c执行完整个函数,看看最后输出什么

My name is Roger.

(直接用师傅大大的了,希望多多包涵QAQ)
如果不改的话

My name is (null)

你可能感兴趣的:(pwn的系统性学习)