BUUOJ PWN 41-60

 

目录

41、jarvisoj_level3_x64

42、[ZJCTF 2019]EasyHeap

43、hitcontraining_uaf

44、picoctf_2018_rop chain

45、babyfengshui_33c3_2016

46、bjdctf_2020_babyrop2

47、jarvisoj_test_your_memory

48、[ZJCTF 2019]Login

49、bjdctf_2020_router

50、picoctf_2018_buffer overflow 1

51、roarctf_2019_easy_pwn

52、cmcc_simplerop

53、[V&N2020 公开赛]easyTHeap

54、ciscn_2019_n_3

55、picoctf_2018_buffer overflow 2

56、pwnable_orw

57、wustctf2020_getshell

58、jarvisoj_level1

59、bbys_tu_2016

60、xdctf2015_pwn200


41、jarvisoj_level3_x64

如果给了libc文件不用libsearch,python3写法 libc_binsh=libc.search(b'/bin/sh').__next__()

 

 

42、[ZJCTF 2019]EasyHeap

想用pwndbg调试  看内存内容  不知道在哪下断点好,始终卡在菜单界面啊。。。在研究研究

断点:b  menu即可  然后c  menu操作 size输入4 内容输入3个a就可以  4个a就不行。。。 输入dbg命令 heap等   c循环

这道题的伪代码就很友好,能让人看懂。   添加很简单能看懂,删除写的一点毛病都没有,编辑看上去写的没问题, 但是修改的size如果太大了不就溢出到下一个chunk了么,就可以精心构造了

主程序里输入符合条件可以执行后门函数,但是看WP说这题BUUOJ做题环境和当时题目实际环境不一样后门函数用不了,这里两种情况都测试一下

1、当时比赛环境 (本机测试)

目的:bss段的magic变量(地址 0x6020c0) 值大于0x1305 即可

知识点:unsortedbin 修改bk指针

流程:创建heap0、heap1、heap2、释放heap1、修改heap0直到heap1的bk为magic-0x10地址、创建heap3(0x80),此时magic-chunk的fd为0x7ffff7ff1b78,符合条件要求(这里有个疑问,此时magic-chunk的size域是多少?难道magic-chunk加入unsortedbin前不检查它的size域合不合法?)

先让heap1挂到unsortedbin,然后通过修改heap0来修改heap1的bk指向magic-0x10,再创建heap1同大小,让它从unsortedbin中出来,这时magic-chunk的fd和bk都是那个0x7f了

本地测试成功

 

2、buu做题环境

free_got表那里就是没转过来弯儿,想了半天才想明白,还有几个小细节不是很懂,那个伪造的chunk,size域一般不都是0x61这种的么,那个0x7f竟然能过!还有看内容不是0或者8地址结尾对齐的么,还能前后偏移的看啊?还有bin/sh\x00为啥非得这么写呢 

精心构造的地址,size域是7f结尾,这样落到fastbin里面的0x70区域,然后我们申请就0x60大小,构造过程如下:

1、add(index0,0x60(随意,就统一0x60吧),内容随意)

2、add(index1,0x60(配合7f),内容随意)

3、del(1)   此时chunk1挂到fastbin 0x70上

4、edit(0,0x80(别太小),内容:a*(0x60)+p64(0)+p64(0x71)+p64(0x6020ad)   从a0+几-几慢慢调,调到-3出现合适的

这样我们就改了chunk1的fd,指向我们伪造的chunk(7f大小符合fastbin规则吧),此时fastbin-->chunk1-->伪造的chunk

5(错误思路)、add(index(这里实际是chunk1),0x60,内容:b'bin/sh\x00' )binsh后面能用到,binsh的地址就是chunk1的地址   <-----这里我思路偷懒了后来调试的时候发现了问题,在add的时候因为不是新chunk有旧数据,直接写数据是不一定准确的,要后期把binsh写入新chunk才可以

5(正确)、add(index1(这里实际是chunk1),0x60,内容:随便 )

6、add(index2,0x60,内容:b'a'*(0x20+3)+p64(free_got))此时,fakechunk我们已经拿到手,看上图fakechunk里面包含了我们第一个指针heap0的地址0x603010,把它改成free_got的地址,然后我们edit(0)就是edit free_got表的地址的内容,把它改成system_plt我们目的就达到了,刚开始就是在这卡了半天没想明白原因,看来指针还是不熟悉。标红的0x20+3,这里我就迷糊了,到底是+2还是+3呢 ??这个小端存储真是可恶   <-----这里流程偷个懒是可以的

7、edit(0,0x60,p64(system_plt))  把free_got改成system_plt ,因为heap0指针已经指向了free_got了,我们的edit0操作全是对free_got操作

8、add(index3,0x60,内容:b'bin/sh\x00')将binsh写入新chunk,heap3的地址就是binsh的地址

9、该有的都有了,执行free就是执行system,system参数地址就是chunk3数据域binsh地址,那么del(3)就可以了

 

 

 

43、hitcontraining_uaf

ida里看到的伪代码真的是难受,全靠猜啊,多做题积累经验,有些题目能看见程序源代码,再对比ida就知道大概意思了,下回看见类似的伪代码就好猜了,多记吧。。而且我看其他人WP里ida的伪代码和我的还不太一样,也许是IDA版本问题还是IDA配置问题??

主函数和menu函数就不说了,先说add函数,一大堆  * 号括号看得人晕头转向,脑瓜子嗡嗡的,特别是那个notelist[i][1],逗我呢?

这里函数指针print_note_content要注意,不太熟悉,遇见次数少,这里就不一一解释伪代码了,直接画图吧。

 

del函数,很明显,free后指针没有置空,

print函数和print_note_content函数指针,绕来绕去的实际就是puts(content指针)

 

题目给了后门函数,想办法把函数指针地址改成后门函数的地址,接下来就是重点:精心构造了

结构体自身所在chunk大小16,申请size如果是8,那么申请的chunk大小8+8=16,申请的第一个node就是两个大小都是16的chunk,然后我们至少还得申请note1呢,再来两个那就是4个16大小chunk了,再一free,4个chunk全挂在0x10 fastbin上了,为了把结构体chunk和用户申请chunk区分开,所以我们申请大小那里最好选择16。先创建node0,大小16,再创建node1,大小还是16,然后释放node0和node1,再打印0,如下图

 

 

44、picoctf_2018_rop chain

按照flag函数要求,win1=1 ,win2参数符合要求,win2=1,flag参数符合要求,那几个负数看代码能找到对应16进制。

程序溢出后先执行win1,再执行win2,再执行flag,按照此顺序构造payload=vun返回地址即win1       win1返回地址即win2        win2返回地址即flag   win1参数空    win2参数    flag参数

 

45、babyfengshui_33c3_2016

菜单增删查改的顺序我很喜欢

 

46、bjdctf_2020_babyrop2

疑问 :我%7$p看到的canary和vul函数里看到的一样吗??这道题是64位的,说好的前6个是寄存器呢,怎么%6$p怎么就看到栈了?

先测试看看输入的格式化字符串地址在偏移几的位置  是6,然后gdb调试,02:0010的位置就是canary,那么它的偏移就是7,%7$p接收就能泄露它的内容,它相对ebp-8,后面的就是常规套路了

 

 

 

47、jarvisoj_test_your_memory

 

 

48、[ZJCTF 2019]Login

溯源反推,最后执行的call rax,rax就是这个passwordchecker函数中局部变量的地址ebp-0x18,将这个地址存放内容改成后门函数地址即可,函数执行完退栈后下一个函数在同一个位置入栈,那么它的ebp-0x18存放shell地址即可,还要有\x00截断

 

49、bjdctf_2020_router

真尴尬,愣是盯着伪代码看了半天,没看出哪有溢出点,结果是道web题。。web学的还不好。。

 

50、picoctf_2018_buffer overflow 1

 

51、roarctf_2019_easy_pwn

这伪代码是啥啊

 

52、cmcc_simplerop

类似这种加载一大堆函数的可以试试mprotect    前面遇到类似的

 

53、[V&N2020 公开赛]easyTHeap

ubuntu18,有tcache,这道题伪代码还可以,很明显free后指针没置空,对输入的chunk大小也放在全局变量保存,图里改了几个变量和函数名

 

 

 

54、ciscn_2019_n_3

use after free

 

55、picoctf_2018_buffer overflow 2

没啥说的

56、pwnable_orw

shellcode,不太懂啊

 

57、wustctf2020_getshell

 

 

58、jarvisoj_level1

远程执行有问题 按照libc做,本地可以试着按照shellcode做

shellcode做法

 

59、bbys_tu_2016

简单是简单,就是IDA里看的偏移不对,难道考查的是手动看buf真正偏移?

 

60、xdctf2015_pwn200

没啥说的

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值