二进制作业第一周
以前除了新生赛再没写过WP,还是多写这东西好(博客搭建还没搞好QWQ)
RE:
所有题来自picoCTF2022,题目很简单,适用于萌新蒟蒻(比如我)入门快速适应re和pwn等题目的模式和解题一般顺序
file-run1:
是的,我们需要一个命令行(显然可以知道是个bash…),丢进去跑就行了…
菜鸟’s writeup结束…
或者有椰叶丢进IDA里瞧瞧…
去找flag吧…(好像是ctrl+鼠标左键?..)
结束了…
file-run2:
丢个Hello!的参数跑就完事了(我太菜了)
中间还打错个字母…
GDB Test Drive:
emm…这玩意就是看看你gdb装没装…虽然但是,我还得学学gdb(毕竟CLion/VS的可视化用惯了…)
(此处gdbme默认有x权限,所以没用chmod)
一条一条运行调试的子命令就行(回头再学吧…gdb不是太会用)
结束…
patchme.py:
咱就是问,还有什么比源码更香的东西吗?..直接分析源码…
python这东西就在windows下跑吧,毕竟库都装在windows下(虽然不知道为啥控制台识别不到库…)
直接看源码,发现就是个字符串比较(暂时不想管那个加密的事…)
有一说一,我才懒得构造那个密码,我直接全删了:
保存了再跑就完事了…(源码在手还怕啥)
至于解密方法能看懂在干啥,但是密码基础一点没有,反正先能跑出来再说,坐等椰叶们讲解(doge)
Safe Opener:
.java也是源码…
SublimeText4 yyds!!!我直接看源码(nnd我不会java怎么办…好在c++基础还可以…)
吐槽:java获取个输入这么费劲?还得手动创建输入流对象?
相信椰叶们都能看懂代码…密钥就是这一坨:
而且一看就知道是base64
《最好用的Base64在线工具》…怕不是不知道CyberChef的大名…
结束…
unpackme.py:
经典的加密解密库(但是我不会)
第12行发现要对解码后的东西进行运行…所以知道加密的是一段代码,所以把exec换成print逝逝:
这里有点奇葩,命令行找不到我的库…
还是打开pycharm吧…
好吧直接结束…
bloat.py:
这个程序的函数名和变量名一看就是故意的…加点注释一点点分析看看:
可以看到函数arg133()中有一个比较,并且对比成功了会有一个输出,我们直接将那个字符串单独打印看看(先把其他代码注释掉):
也就是说我们输入的arg432变量的值就是这个,所以将代码恢复原样重新以这个输入值运行一遍:
解密成功!
注: .enc文件为常见的加密后的文件格式,常常出现在勒索病毒运行后的结果,或对文件进行加密的情况,这里的代码即对其进行特定方式的解密
Fresh Java:
这道题也不难,逆向一下class文件,然后写个解密脚本就行
第一步-java逆向:
某椰叶提供的在线逆向网站:http://javare.cn(注意文本是白色的…我以为出问题了)
复制到一个java文件,观察发现(虽然我不会java,但是好在会其他语言…)对比的是一个字符串的每一个字符(ASCII码)
于是,我们可以使用正则表达式…把那一堆ASCII码提取出来(这里在sublimetext4里使用查找替换的正则模式):
第二步-正则部分:
第一步:
第二步:
直接复制出来
第三步-解密脚本:
这是我们处理后的ASCII码(放在in.txt里)↑
然后写脚本转换为字符串(注意最开头的34被删了,因为它是字符串的长度),这里我使用c++:
之所以不使用我最擅长的c是因为c++的STL算法库有reverse函数
暂时无法在飞书文档外展示此内容
运行:
结束…
Bbbbloat:
直接拖IDA里看main:
直接输549255就行:
结束…
Unpackme:
这里提示upx脱壳
首先扔进DIE里看看,发现有UPX加壳(注意是ELF64—Linux):
所以我们去下载UPX进行脱壳(就是第一个):
免安装,解压后即可使用(xz先解压然后tar解包):
脱壳后再检测发现已经没有壳了:
丢进IDA即可(代码一看就懂—第17行):
运行:
结束…
Keygenme:
我懂那个意思…运行到字符串比较,然后直接看v14变量就行
但是我的IDA各种问题无法调试…正在重装…
装好了…IDA远程调试看看这篇文章:
好现在上题:
至于IDA里打开就不说了,直接找到main函数里if语句调用的函数,如果发现是类似&func+1这样的就F5重新反编译一下一般就可以了:
经过分析发现flag存在v17[[32-67]那么直接在v17处理后打断点调试就行:
找到v17,观察(整理)出flag即可:
picoCTF{br1ng_y0ur_0wn_k3y_9d74d90d}
结束…
Wizardlike:
运行一遍一看就是个纯地图
然后很多地方发现过不去—这不就穿墙挂么~~~
所以我们IDA吧…别问我怎么找到那个函数的…
没错就是这里↑
看来是判断是否越界的函数了…(类似我以前写的贪吃蛇的is_over_lap()和againstTheWall()函数):
好了帮助理解结束了,现在直接把返回的0LL全改成非0就行(之所以没说改成1LL是因为我把小端和大端搞反了—我是菜逼):
然后保存就行,接下来直接跑代码观察地图就行,发现地图的形状就是flag~~
跑吧~~
地图贼反人类…慢慢看吧…
picoCTF{ur_4_w1z4rd_4844AD6F}
好像每个人的地图还不一样…
结束…
PWN:
test_your_nc:
很简单,运行就知道是获取到shell了
但是作为PWN手我们要用正确的解题方式
丢IDA里F5大法,不用解释
结束…
Rip:
总体分析:
先运行,发现有输入(盲猜gets()),丢IDA吧…
好,盲猜正确…接下来该面向google解题了…
看看有没有其他可利用的函数—>找到了fun():
于是我们就要想办法跳转到这个函数,从而获得shell入口
如何构造字符串:
可以发现s变量占15字节(反编译也能看出来char s[15])
现在问题来了,我们要知道栈溢出的细节:
用DIE工具查看该文件,发现是ELF64(废话),那么针对ELF64的分析如下:
因为本蒟蒻只会一点8086,所以也就大致先看看,有个概念再说…
其实重点就是这张图↑
对栈帧的分析(也就是分析上图):
首先要知道对于函数栈帧来讲,也就是对于堆栈而言,是从高地址向低地址分配的(所以对s的溢出会影响到上一个函数栈帧—我理解的应该没错)
那么我们要进行计算,首先是15字节的s数组,以任意值进行填充,然后是填充当前函数帧的ebp(对于ELF64而言,且其占用8字节—因为是64位机器),此时我们就有15+8==23字节了
接下来就是我们实际要覆盖的返回地址了,这里在IDA找到fun()函数的地址(0x401186)
于是我们在python中写exp(我的环境在linux安装,所以在linux下编写)—我也不知道我啥时候装的环境
代码如下:
1 | from pwn import * |
运行结果:
问题来了:
是的没错,玄学,这个问题先放在这里吧,暂时搞不了…(哪天回头再看看吧,有地方没理解到位)
而且那个堆栈平衡以后也得仔细看看…
勉强算是结束了吧…