以前除了新生赛再没写过WP,还是多写这东西好(博客搭建还没搞好QWQ)

RE:

所有题来自picoCTF2022,题目很简单,适用于萌新蒟蒻(比如我)入门快速适应re和pwn等题目的模式和解题一般顺序

file-run1:

img

是的,我们需要一个命令行(显然可以知道是个bash…),丢进去跑就行了…

img

菜鸟’s writeup结束…

或者有椰叶丢进IDA里瞧瞧…

img

去找flag吧…(好像是ctrl+鼠标左键?..)

img

结束了…

file-run2:

丢个Hello!的参数跑就完事了(我太菜了)

img

中间还打错个字母…

GDB Test Drive:

emm…这玩意就是看看你gdb装没装…虽然但是,我还得学学gdb(毕竟CLion/VS的可视化用惯了…)

(此处gdbme默认有x权限,所以没用chmod)

img

一条一条运行调试的子命令就行(回头再学吧…gdb不是太会用)

img

结束…

patchme.py:

咱就是问,还有什么比源码更香的东西吗?..直接分析源码…

img

python这东西就在windows下跑吧,毕竟库都装在windows下(虽然不知道为啥控制台识别不到库…)

img

直接看源码,发现就是个字符串比较(暂时不想管那个加密的事…)

img

有一说一,我才懒得构造那个密码,我直接全删了:

img

保存了再跑就完事了…(源码在手还怕啥)

img

至于解密方法能看懂在干啥,但是密码基础一点没有,反正先能跑出来再说,坐等椰叶们讲解(doge)

Safe Opener:

.java也是源码…

SublimeText4 yyds!!!我直接看源码(nnd我不会java怎么办…好在c++基础还可以…)

吐槽:java获取个输入这么费劲?还得手动创建输入流对象?

相信椰叶们都能看懂代码…密钥就是这一坨:

img

而且一看就知道是base64

img

《最好用的Base64在线工具》…怕不是不知道CyberChef的大名…

结束…

unpackme.py:

经典的加密解密库(但是我不会)

img

第12行发现要对解码后的东西进行运行…所以知道加密的是一段代码,所以把exec换成print逝逝:

img

这里有点奇葩,命令行找不到我的库…

img

还是打开pycharm吧…

img

好吧直接结束…

bloat.py:

这个程序的函数名和变量名一看就是故意的…加点注释一点点分析看看:

img

可以看到函数arg133()中有一个比较,并且对比成功了会有一个输出,我们直接将那个字符串单独打印看看(先把其他代码注释掉):

img

img

也就是说我们输入的arg432变量的值就是这个,所以将代码恢复原样重新以这个输入值运行一遍:

img

解密成功!

注: .enc文件为常见的加密后的文件格式,常常出现在勒索病毒运行后的结果,或对文件进行加密的情况,这里的代码即对其进行特定方式的解密

Fresh Java:

这道题也不难,逆向一下class文件,然后写个解密脚本就行

第一步-java逆向:

某椰叶提供的在线逆向网站:http://javare.cn(注意文本是白色的…我以为出问题了)

img

复制到一个java文件,观察发现(虽然我不会java,但是好在会其他语言…)对比的是一个字符串的每一个字符(ASCII码)

于是,我们可以使用正则表达式…把那一堆ASCII码提取出来(这里在sublimetext4里使用查找替换的正则模式):

第二步-正则部分:

第一步:

img

img

第二步:

img

img

直接复制出来

第三步-解密脚本:

img

这是我们处理后的ASCII码(放在in.txt里)↑

然后写脚本转换为字符串(注意最开头的34被删了,因为它是字符串的长度),这里我使用c++:

之所以不使用我最擅长的c是因为c++的STL算法库有reverse函数

暂时无法在飞书文档外展示此内容

运行:

img

结束…

Bbbbloat:

直接拖IDA里看main:

img

直接输549255就行:

img

结束…

Unpackme:

这里提示upx脱壳

首先扔进DIE里看看,发现有UPX加壳(注意是ELF64—Linux):

img

所以我们去下载UPX进行脱壳(就是第一个):

img

免安装,解压后即可使用(xz先解压然后tar解包):

img

脱壳后再检测发现已经没有壳了:

img

丢进IDA即可(代码一看就懂—第17行):

img

运行:

img

结束…

Keygenme:

我懂那个意思…运行到字符串比较,然后直接看v14变量就行

但是我的IDA各种问题无法调试…正在重装…

装好了…IDA远程调试看看这篇文章:

远程调试

好现在上题:

至于IDA里打开就不说了,直接找到main函数里if语句调用的函数,如果发现是类似&func+1这样的就F5重新反编译一下一般就可以了:

经过分析发现flag存在v17[[32-67]那么直接在v17处理后打断点调试就行:

img

找到v17,观察(整理)出flag即可:

img

picoCTF{br1ng_y0ur_0wn_k3y_9d74d90d}

结束…

Wizardlike:

运行一遍一看就是个纯地图

然后很多地方发现过不去—这不就穿墙挂么~~~

所以我们IDA吧…别问我怎么找到那个函数的…

img

没错就是这里↑

看来是判断是否越界的函数了…(类似我以前写的贪吃蛇的is_over_lap()和againstTheWall()函数):

img

img

好了帮助理解结束了,现在直接把返回的0LL全改成非0就行(之所以没说改成1LL是因为我把小端和大端搞反了—我是菜逼):

img

然后保存就行,接下来直接跑代码观察地图就行,发现地图的形状就是flag~~

跑吧~~

img

地图贼反人类…慢慢看吧…

picoCTF{ur_4_w1z4rd_4844AD6F}

好像每个人的地图还不一样…

结束…

PWN:

test_your_nc:

很简单,运行就知道是获取到shell了

img

img

但是作为PWN手我们要用正确的解题方式

img

丢IDA里F5大法,不用解释

结束…

Rip:

总体分析:

先运行,发现有输入(盲猜gets()),丢IDA吧…

img

好,盲猜正确…接下来该面向google解题了…

看看有没有其他可利用的函数—>找到了fun():

img

于是我们就要想办法跳转到这个函数,从而获得shell入口

如何构造字符串:

img

可以发现s变量占15字节(反编译也能看出来char s[15])

现在问题来了,我们要知道栈溢出的细节:

img

用DIE工具查看该文件,发现是ELF64(废话),那么针对ELF64的分析如下:

基础知识可以看看这篇文章

因为本蒟蒻只会一点8086,所以也就大致先看看,有个概念再说…

img

其实重点就是这张图↑

对栈帧的分析(也就是分析上图):

首先要知道对于函数栈帧来讲,也就是对于堆栈而言,是从高地址向低地址分配的(所以对s的溢出会影响到上一个函数栈帧—我理解的应该没错)

那么我们要进行计算,首先是15字节的s数组,以任意值进行填充,然后是填充当前函数帧的ebp(对于ELF64而言,且其占用8字节—因为是64位机器),此时我们就有15+8==23字节了

接下来就是我们实际要覆盖的返回地址了,这里在IDA找到fun()函数的地址(0x401186)

于是我们在python中写exp(我的环境在linux安装,所以在linux下编写)—我也不知道我啥时候装的环境

img

代码如下:

1
2
3
4
5
6
from pwn import *  
p=remote("node4.buuoj.cn",29939) #靶机地址和端口
payload='A'*15+'B'*8+p64(0x401186+1).decode("iso-8859-1")
#char s的15个字节+RBP的8字节+fun函数入口地址,+1为了堆栈平衡,p64()发送数据时,是发送的字节流,也就是比特流(二进制流)。
p.sendline(payload)
p.interactive()

运行结果:

img

问题来了:

img

是的没错,玄学,这个问题先放在这里吧,暂时搞不了…(哪天回头再看看吧,有地方没理解到位)

而且那个堆栈平衡以后也得仔细看看…

​ 勉强算是结束了吧…