周末打了一下第二届BJDCTF,所谓的”新生赛”,之前做了第一届的题还以为第二届和第一届一样简单,随便rop就能打。结果。。。。真的是服了出题人的脑洞,好端端的pwn硬生生整成了linux命令大考卷,而且还都不是正常的1604的环境。u1s1,出题人要是离我100公里以内我必开车去锤爆他的头
Pwn
one_gadget
19.04的题,题目本身泄露了printf的地址,可以获得libc_base,然后输入one_gadget就行,但是要注意的是scanf是用十进制输入的,所以要转换一下进制
exp
1 | from pwn import* |
r2t3
程序分析
这题在name_check函数的strcpy函数存在溢出,但是同样有一个长度检测,需要满足3< v3 < 8
1 | char *__cdecl name_check(char *s) |
可以看到传递给name_check的参数是char类型的,存在整数溢出,输入260个字符之后他会变成260-255=5个字符,符合范围内,那么可以先用260个字符试一下
nice
那我们补齐到260就行了
exp
1 | #!/usr/bin/env python |
ydsneedgirlfriend2
64位UAF,18.04的环境,和HITCON-trainning的lab10,就是hacknote那题,很像
1 | unsigned __int64 dele() |
不过问别的师傅说要tcache dup?不会,没学过tcache,等后面学会了看看再更新下别的解法,挖坑待填……
经过调试可以知道,释放后再申请的chunk的bk位有一个print_girlfriend_name函数,那我们把print_girlfriend_name改了,改成后门函数就行,然后执行show的时候会执行后门函数
1 | from pwn import* |
r2t4
这题就是个格式化字符串漏洞利用,存在栈溢出只能控制到rbp,而且有canary,而且只有一次输入,泄露完canary的话就不能继续了
1 | int __cdecl main(int argc, const char **argv, const char **envp) |
存在canary就会有___stack_chk_fail函数,那我们把这个函数的got表改成backdoor的地址,然后再触发canary,就能执行backdoor了
计算得canary之间的距离是0x30-0x8=0x28=40
exp
1 | from pwn import* |
但是这题要在19.04的环境下打才能成功,好在我pull了@知世师傅的docker镜像
2022.12.6更新:不一定要用1904的环境打,只要pwntools保持新版本即可,老版本pwntools的fmtstr_payload可能会出问题
本题参考链接:https://www.anquanke.com/post/id/180009#h3-7
secret
程序分析
这题简直就是魔鬼,做这题我IDA都卡死了
main函数里直接有cat /flag,只要执行完上面那些东西就行
main
1 | __int64 __fastcall main(__int64 a1, char **a2, char **a3) |
if条件要满足sub_40136D返回值不为0,才能继续下面的,下面的sub_401301函数基本上就是打印一些字符,不重要了,不看它
我们来看下那个超大函数sub_40136D
函数大到我不能F5,无奈之下只能看汇编
太多了,我们这里就看两块,因为后面结构都是一样的
可以看到他每个函数都调用了sub_46A329函数,那我们看一下sub_46A329函数
1 | unsigned __int64 sub_46A329() |
这个函数就是将我们输入的字符读进去,atoi转化一下
然后继续看sub_40136D函数,可以看到它将我们的输入和0x476B比较,如果相同,就跳转到下一函数块继续进行比较,如此比较1w次,若都成功则返回1继续执行下面的,就能拿到flag了
那我们要将1w个函数块中的这些数据都提取出来然后一个个发送过去,发送1w次
怎么提取呢?手动复制粘贴?那必不可能。。
这里感谢@KMFL师傅的idapython脚本,可以提取这些数字还能转化成10进制的
1 | import idc,idaapi,idautils |
然后直接将提取出来的结果send过去
exp
1 | from pwn import* |
据说还有更简单的方法,name溢出覆盖printfgot表修改成system
还没试过,挖坑待填……
test
这个题就是纯属考linux命令,属实离谱
看下源码
1 |
|
需要满足这些strstr函数的返回值都为0,才能把输入的字符当成命令执行
strstr函数是什么功能呢?
1 |
|
那意思是输入的内容不能出现如下字符(一个都不行)
1 | nepbushiflag|/$`-<>. |
这里是直接看了@EDS师傅的wp解出来的
直接贴个链接http://www.ericdshen.com/index.php/archives/7/
我们输入x86_64(相当于/bin/sh),然后就能执行shell了,就可以直接cat flag了
这波操作属实骚
snake_dyn
这个题是个贪吃蛇game,需要玩到3000分并且移动2333步,就能获得shell,然后就可以直接cat flag
这题我是纯玩出来的,据说有漏洞,但是我看到那么多数组啥的我就懒得看了(没错,我就是懒狗
贴两张图纪念一下
rci
这个题感觉和test有点像,也是过滤了一些字符,但是这个代码的函数有点奇奇怪怪的,不想看了,问问别的师傅
感谢@Keer师傅
开两个终端,同时nc
第一个ls -lai /tmp
第二个ls -lai
看第二个的.目录对应的前面那个文件号,然后到第一个的回显里面去找那个号,找到对应的文件
在第二个的第二次输入/tmp/R0OM#0328483547(这个文件名的数字是随机生成的)
然后在第二个里面输入$0
就有shell了,就可以 cat imagin了
ps:不太懂原理,等明白了再回来补一下,挖坑待填……
Misc
最简单的misc-y1ng
zip伪加密
得到png
16进制转化一下hex得到flag
1 | BJD{y1ngzuishuai} |
Reverse
我就是菜狗,re只能做得出这种搜索字符串就出flag的题
guessgame