Polar靶场做题 —— test_format

我学习pwn已经有2个月了,这是我第一次发博客,好紧张啊~~~~~~~~~~~ 

我这个社恐的孩子会不好意思的

我朋友推荐我在polarctf团队的靶场上做做题(应该是这个名字哈,好久之前推荐的,记性稍微不太好,如果名字说错了勿怪勿怪)

现在我才做了做,然后我就写了一部分的wp


先在虚拟机上查看一下

Polar靶场做题 —— test_format_第1张图片

32位的一个程序,开了NX和canary,然后ida打开看一下

Polar靶场做题 —— test_format_第2张图片Polar靶场做题 —— test_format_第3张图片

Polar靶场做题 —— test_format_第4张图片

在input函数里,有输入输出,一看就是格式化字符串,然后还有一个shell函数,那具体的思路就应该是通过格式化字符串把n的值改为4,那么我们就需要把n的地址拿到,还要知道read输入的位置是第几个参数。

好在啊,这个n不在栈上,双击一下n,去到n的位置

Polar靶场做题 —— test_format_第5张图片

得到n的地址是    0x0804030

然后就需要在虚拟机里gdb调试一下了,在read函数的位置下一个断点,然后输入aaaaaaaa

Polar靶场做题 —— test_format_第6张图片

然后再输入   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()

终于写完了,要是有大佬看见哪里写错了,欢迎指正。

你可能感兴趣的:(python)