美文网首页
攻防世界新手

攻防世界新手

作者: Hexad | 来源:发表于2020-03-05 23:16 被阅读0次

    就按照题目的难易程度写

    新手区没有涉及到栈的相关知识,几乎是栈漏洞

    get_shell

    第一个题目比较简单

    ida进入main函数查看,有system和bin/sh

    直接nc连接就可以拿到flag

    CGfsb

    通过main函数可以看出,当pwnme=8,就可以拿到flag

    漏洞点:格式化字符漏洞,printf()函数使用不当,造成任意内存读写,解决方法:利用%n将%n之前printf已经打印的字符个数赋值给偏移处指针所指向的地址位置

    pwnme地址 偏移 exp flag

    hello_pwn

    main

    进入主函数,双击进入sub_400686看一下

    让dword_601068=1853186401然后执行sub_400686函数就可以拿到flag

    read存在溢出,ida查看unk_691968和dword_60106c偏移量为4,覆盖dword_60106c值即可

    when_did_you_born

    输入1926自动退出,返回主函数,有gets函数,可以利用gets函数输入v5把原本v6的值覆盖然后替换成1926,

    var20和var18相差0x8个字符,当v5输入大于0x8个字符,会覆盖掉v6,然后重新给v5赋值,

    exp

    注: 0x786的十进制是1926

    level0

    return返回vulnerable_function函数,进去查看一下

    read存在溢出

    system函数 bin/sh

    思路:read溢出到system,然后执行bin/sh就可以拿到flag

    system_addr

    这是一个64位的程序,与32位不同,无法直接传参进去,64位的程序会先把参数先存入寄存器中,前六个参数按顺序存储在寄存器rdi, rsi, rdx, rcx, r8, r9,所以要先找到rdi的地址

    bin/sh-addr rdi-addr exp1

    buf大小是80h,再加上ebp的8h

    简单的rop原理payload = padding + retpadding为136   //十六进制88改为十进制136

    exp2

    函数中有callsystem函数,可以直接调用shell

    callsystem-addr exp3

    三个exp均能调试成功

    level2

    level2和level0思路相同,有system和bin/sh,read函数溢出,只是level2为32位

    payload='a'*(0x88+0x4)+p32(sys_add)+'aaaa'+p32(shell_add)

    guess_num

    全开的一道题

    and这道题没有主函数,找了半天

     需要连续猜中10次才能得到flag,但是上面函数有gets这个危险的函数

     v9经过0x20个字符就溢出到seed,那么如果把seed[0]变成我们可控的数字,就可以使v6和v8相等,得到flag

    这个题有有了一个新的知识点:随机数生成的原理:https://www.jianshu.com/p/0bc6c65addfd

    rand和srand:随机函数生成的随机数并不是真的随机数,他们只是在一定范围内随机,实际上是一段数字的循环,这些数字取决于随机种子。在调用rand()函数时,必须先利用srand()设好随机数种子,如果未设随机数种子,rand()在调用时会自动设随机数种子为1。

    关于ctype库与dll:使用python标准库中自带的ctypes模块进行python和c的混合编程

    libc共享库:使用ldd查找

    指定一个随机数的种子,即seed[0],然后在脚本中模拟随机数生成,再将生成的数字输入到程序中,那么就可以一直都能答对,在本题目中我们指定的seed[0]是1。

    from  ctypes  import* #python标准库中自带的ctypes模块进行python和c的混合编程

    int_overflow

    选1可以输入名字和密码ida分析密码要3到8位否则判定无效数字,选2直接退出,v3范围是0~255,超出会造成整数溢出

    3.进到else里,将 read 读进来的 s 复制到 dest 中,是一个可以利用的栈溢出。dest距ebp是14h,再加上ebp的大小,所以需要24个padding填充;

    s长度大于255,s溢出后返回地址覆盖为what_is_this函数的地址,即可拿到flag;

    from  pwn  import*

    r=process('./int_overflow')

    e=ELF("./int_overflow")  

    what_is_this_addr=e.symbols['what_is_this']       //自动生成地址

    r.recvuntil('Your choice:')

    r.sendline('1')

    r.recvuntil('Please input your username:')

    r.sendline('aaa')

    r.recvuntil('Please input your passwd:')

    payload='a'*(0x14+0x4)+p32(what_is_this_addr)

    payload=payload.ljust(262,'a')

    r.sendline(payload)

    r.interactive()

    cgpwn2

    看到了gets和fgets函数

    name在bss段中,用fgets输入“/bin/sh“,返回地址覆盖成system的地址,再把传参(/bin/sh)到system里面即可get shell了

    padding

    string

    printf函数处发现一个格式化字符串漏洞

    回去看一下,发现v5=(_int64)v4,可以看到程序给出了这两个数,一个是68, 一个是85,并且可以看到程序会将数组的地址打印出来的,

    当v4=85时,v4[0]的地址也就泄露出来了,可以利用上面发现的格式化字符串漏洞,将v3[0]改写成85,这样就可以到达v1的位置

    ./string

    相关文章

      网友评论

          本文标题:攻防世界新手

          本文链接:https://www.haomeiwen.com/subject/bojilhtx.html