目录
50、picoctf_2018_buffer overflow 1
55、picoctf_2018_buffer overflow 2
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
没啥说的