![](https://img.laitimes.com/img/9ZDMuAjOiMmIsIjOiQnIsIyZuBnLwgTMwgzMzgTNx0yM1EzMwMDM4EjNxITMxIDMy0iM5YDM2YTMvwlMxEjMwIzLcJTO2AjN2EzLcd2bsJ2Lc12bj5ycn9Gbi52YuAjMwIzZtl2Lc9CX6MHc0RHaiojIsJye.png)
IDA查看
x的地址 0804A02C
.data:0804A02C x dd 3 ; DATA XREF: main+65↑r 查看得知是格式化漏洞 第10行存在格式化字符串漏洞,我们可以利用它随意读写的特性让x=4 x_addr=0x804A02C![]()
buuctf pwn jarvisoj_fm
AAAAA.%x.%x.%x.%x.%x.%x.%x.%x.%x.%x.%x.%x.%x.%x.%x.%x.%x.%x.%x
那么可以看到输入点的参数在栈上存储的位置,手动输入计算得到偏移为11
利用x的地址配合上%11$n 将x修改为4
payload=p32(x_addr)+"%11$n"
稍微解释一下payload,首先传入x参数的地址,这个地址存放在栈上偏移为11的位置,利用%11$n,定位到了偏移为11的位置,往这个位置写入数据,写入的数据由%11$n前面的参数的长度决定,而我们的x参数的地址,正好是4位,不需要添a来补齐位数就可以直接利用,将x参数的地址的值改成了4,获取了shell