BUU的刷题记录(非WP),只记录一些自己踩坑和知识点,以及没什么用但舍不得删的解题脚本。
[GUET-CTF2019]re
脱壳之后导入IDA64找加密函数,正常就是写脚本解密,中间少了一位可以爆破。但是这个题,这个题它它它它它中间的17和16居然是倒过来写的,倒过来写的!!!我*&……%¥#@~我我我我我找了好久,找了好久啊,我就说我不可能输反啊扣努压路!
然后就是如何在linux里跑一个elf文件,因为有一位不知道要爆破,就这命令找了半天……./文件名
这个命令就能跑了,然后是flag脚本。
1 | flag=[] |
[SUCTF2019]SignIn
dbt诚不欺我,二进制手果然还是避不开学密码的命运……
搜字符串,交叉引用,然后F5大法……
1 | __int64 __fastcall main(int a1, char **a2, char **a3) |
sub_96A函数,看起来就是把字符串转成ASCII码的字符串,左移四位然后加上下一位的ASCII码,这样循环到字符串结束。然后emmm是__gmpz_init_set_str这个看起来有点迷的函数,查了一下才知道是高精度算法库,学习一下查阅官方文档吧嘤嘤嘤
https://gmplib.org/manual/
简单来讲有点像pow函数,不过这个函数最后一位指定进制。然后看到65537 (我DNA动了)这么好的数字怎么能不拿来算RSA呢?!!!
大胆猜测一下,这两串数字应该有一个是密文,有一个是n,那么接下来就干他!
kafu分解大法……得到p,q,写脚本……
1 | from Crypto.Util.number import * |
咳咳……但是不要学我瞎猜做题大法,万一不是就白瞎了……
Youngter-drive
我看了一下这个题的题解感觉都很奇怪呢……?
线程的问题我确实是一点不会 (被打),但是函数还是能看得懂的吧。线程的部分大概意思是,创建两个线程交替进行,一个线程是下面这个加密函数,一个线程是仅仅把字符串往前推。
1 | char *__cdecl sub_411940(int a1, int a2) |
第一句if限定了只能是大小写字母,后面的if判断,如果是大写字母,写入off[a2[a1]-38],如果是小写,写入off[a2[a1]-96]。这里加密的是输入,也就是说程序里给的”TOiZiZtOrYaToUwPnToBsOaOapsyS”这么一串字符是需要解密的。
那么去找,偶数位字符的索引,就是a2[a1]-38和a2[a1]-96的值。那么我们怎么知道哪个+38哪个+96呢?看题解大多数是反过来的,即认为大写加密后变成小写,小写加密后变成大写(我超,我当时竟然看了半天没看懂,一直是反着写的)。
个人认为这样不太好,万一加密之后不是反过来的,而是有一个码表呢?所以还是爆破大法好(x
自己原来是照着题解写的脚本,不过后来按自己的思路改了一下,这就爆破吧反正,直接无脑爆破(bushi
然后还有一个坑是因为这个函数,dword_418008的值是0x1d,也就是29,判断>=0的话就是30位字符串,所以题目中给的被加密后的字符串实际上少了一位,打出来的flag是29位。
1 | void __stdcall StartAddress_0(int a1) |
哈啊哈哈哈哈哈,看了好多题解都说猜,这怎么能猜呢(bushi当然是要看一下加密字符串后面还有什么玩意啦~
因为这是个常规情况吧,就是加密之后的字符因为码值比较小,所以没办法显示成字符,只能以数字形式表示。跟进去看看,后边果然跟了个0x10,那就加进去就完事了~
1 | str="QWERTYUIOPASDFGHJKLZXCVBNMqwertyuiopasdfghjklzxcvbnm" |
[WUSTCTF2020]level1
这个很简单,直接上脚本……注意索引为0的地方随便加个啥东西,不然跑出来不对(别问我怎么知道的……)
1 | s=[0,198,232,816,200,1536,300,6144,984,51200,570,92160,1200,565248,756,1474560,800,6291456,1782,65536000] |
[ACTF新生赛2020]usualCrypt
base64变表。其实是网上嫖的代码
1 | # -*- coding:utf-8 -*- |
[MRCTF2020]Transform
记得翻转s0 (别问我怎么知道的)
后面的字符串长度不够,补一个0,而且看一下代码逻辑就知道,是以len33为索引补全flag,所以肯定有一个索引是0,也就是len33里必然有一个元素是0。
1 | cyber=[0x67,0x79,0x7B,0x7F,0x75,0x2B,0x3C,0x52,0x53,0x79,0x57,0x5E,0x5D,0x42,0x7B,0x2D,0x2A,0x66,0x42,0x7E,0x4C,0x57,0x79,0x41,0x6B,0x7E,0x65,0x3C,0x5C,0x45,0x6F,0x62,0x4D,0x3F] |
相册
我超有病毒不敢做
咳咳,等我攒几道安卓题一起看看,学一下jeb怎么用的 (才不是因为懒)
来填坑了~咳咳!
感觉安卓逆向跟exe也差不多嘛,找关键字符串定位主要函数,然后分析代码逻辑。不过apk可以解压出来一堆文件,在lib里有个so文件比较关键,这个里面可能会有比较重要的信息,一般是个ELF文件,拖进IDA里找字符串就好了,就是java代码真难看(x
这个题忘记录了,反正就是找mail字符,主函数里看base64加密,然后去so文件里找最长的字符串(因为要的是完整邮箱)解密。IDA里最后三个字符串很明显,都是=结尾。
[WUSTCTF2020]level2
??????这个题搞什么???脱壳之后拖进IDA就有flag???我还以为有坑,交上去竟然对了?做的我一脸黑人问号?(不过今天倒是轻松了)
[HDCTF2019]Maze
呜呜呜呜吃到坏的柚子肚子难受睡不着,来摸几道逆向
首先查壳,有壳的,名字很长,改一个短一点的就能脱掉,也不知道是什么原理~
载入IDA,搜关键字符串,定位到主函数,发现反编译不了,是因为跳转到一个不存在的地址(IDA中会有标红,猜测是花指令)。
之前了解过一点花指令hhhhhh,一眼xor然后jnz,标准的花指令格式(bushi),给它nop掉
选中指令-右键keypatch-patch(快捷键ctrl+alt+k)
懒得搜命令就自己在IDA里瞎找,竟然找到了……
下面的call函数先不要nop,因为可能是关键代码。摁d转成字节数据,然后一个一个试(先将第一个数据nop掉再转成代码,不行再将前俩数据nop……)发现nop掉第一条指令之后就正常了,IDA自动将后面的字节数据转为代码。然后选中main函数中所有关键代码,摁p将其声明为函数,然后F5大法……
题目是迷宫题,wsad上下左右,asc_408078值是7,迷宫抠出来长度是70,推测是7X10的迷宫,那么打出来看看……
1 | *******+** |
初始位置是+,结束位置在F,因为看结束判断条件是(5,-4),也就是F的坐标。然后手撕就好了
flag{ssaaasaassdddw}
[GWCTF 2019]xxor
1 | __int64 __fastcall main(int a1, char **a2, char **a3) |
戳进去sub_400770看看,是个判断,一大堆数字,还有负的,应该是IDA把变量识别为singed的问题,数字本身应该是unsinged,看了下别人转出来都是正的(呜呜呜呜呜呜呜呜),不过应当无影响
用这个方程组把数组a解出来,然后把前面的加密过程逆着写回去就可以了 鹅鹅鹅,我先做了才看见RX的hint说用z3,我直接手解方程组了
当时看见一堆移位异或,还想着是不是什么高深的加密算法,应该不会是倒着写回去就可以的那种,看了题解, 呃好吧,还真是倒着写回去就行(bushi……
a2前面写了一堆没用的赋值,但最后运算的时候用的还是unk_601060,点进去看下,是2,2,3,4中间一堆0,应该是long long的锅,总之a2=[2,2,3,4]。
本来用python写了,但是这个玩意应该是有溢出的舍位,但是python不会溢出啊啊啊啊啊啊啊,打出来好长一串 (裂开),我也不会用python限制数字位数,那就老老实实用C吧……注意小端序就好了,因为我们这是把他原本的long long拆成两个int。对比了一下代码,我的代码跟别人写的题解都一样,懒得python转c了,直接嫖代码……
1 |
|
[MRCTF2020]Xor
非常白给异或题~直接反编译主函数会报错,进去报错的那个函数然后反编译,再反编译主函数就可以了。(虽然不明白原理是什么)虽然前面写了一大堆代码,但是直接看判断条件就好了,判断一个长度之后跟索引异或,直接上脚本。
1 | s=chr(0x4d)+r'SAWB~FXZ:J:`tQJ"N@ bpdd}8g' |
[FlareOn4]IgniteMe
白给题,直接上脚本
注意这里异或用的是明文
然后就是学习了一下抠数字的快捷方法……
1 | f2 修改多处同名变量 |
1 | s=[0xd,0x26,0x49,0x45,0x2A,0x17,0x78,0x44,0x2B,0x6C,0x5D,0x5E,0x45,0x12,0x2f,0x17,0x2b,0x44,0x6F,0x6E,0x56,9,0x5f,0x45,0x47,0x73,0x26,0x0A,0xd,0x13,0x17,0x48,0x42,1,0x40,0x4D,0x0C,2,0x69] |
[MRCTF2020]hello_world_go
盲猜花指令,IDA进去红一片 ,明天再看看嘤嘤嘤
草,猜错了,是go语言。。。但是没啥用,F5进去之后有个叫aFlagHelloWorld的变量,flag就在这里。。。
[WUSTCTF2020]level3
一个base64变表,啊啊啊啊,对着加密函数看了半天,明明是标准实现,晕了……看了题解才知道前面还有对base64进行变表的函数
1 | __int64 O_OLookAtYou() |
在这贴个base64标准实现吧……
1 | void encodeBase64(char* str,int len,char** in){ |
然后贴这个题的脚本
1 | enc="d2G0ZjLwHjS7DmOzZAY0X2lzX3CoZV9zdNOydO9vZl9yZXZlcnGlfD==" |
最后贴个base64变表的解码伪代码……
1 | enc="密文" |
[WUSTCTF2020]Cr0ssfun
很少见的抠ASCII码就能出来的题目……
1 | a1=[] |
[BJDCTF2020]BJD hamburger competition(.net逆向)
看来很有必要了解一下.net和安卓逆向…… (懒,先咕……)
甩个目录:attachment\BJD hamburger competition_Data\Managed\Assembly-CSharp.dll
C#源代码就在这里
关键函数:
1 | else if (name == "汉堡顶" && Init.spawnCount == 5) |
可以看到就是一个字符串的哈希值,SHA1已经给出来了,然后去看看ButtonSpawnFruit
1 | public class ButtonSpawnFruit : MonoBehaviour |
取了前20位的MD5,找个在线网站解一下SHA1,然后跑一下MD5,注意转成大写就好了,python都用的小写……
1 | import hashlib |
[FlareOn6]Overlong
我真傻,真的,我竟然少写一个else,好多字符跑不出来,绝了……
看了下题解,这个好像是修改长度就行的…… 又小丑了……
1 | encry=[0xE0,0x81,0x89,0xC0,0xA0,0xC1,0xAE,0xE0,0x81,0xA5,0xC1,0xB6,0xF0,0x80,0x81,0xA5,0xE0,0x81,0xB2,0xF0,0x80,0x80,0xA0,0xE0,0x81,0xA2,0x72,0x6F,0xC1,0xAB,0x65,0xE0,0x80,0xA0,0xE0,0x81,0xB4,0xE0,0x81,0xA8,0xC1,0xA5,0x20,0xC1,0xA5,0xE0,0x81,0xAE,0x63,0xC1,0xAF,0xE0,0x81,0xA4,0xF0,0x80,0x81,0xA9,0x6E,0xC1,0xA7,0xC0,0xBA,0x20,0x49 ,0xF0,0x80,0x81,0x9F,0xC1,0xA1,0xC1,0x9F,0xC1,0x8D,0xE0,0x81,0x9F,0xC1,0xB4,0xF0,0x80,0x81,0x9F,0xF0,0x80 ,0x81,0xA8,0xC1,0x9F,0xF0,0x80,0x81,0xA5,0xE0,0x81,0x9F,0xC1,0xA5,0xE0,0x81,0x9F,0xF0,0x80,0x81,0xAE,0xC1,0x9F,0xF0,0x80,0x81,0x83,0xC1,0x9F,0xE0,0x81,0xAF,0xE0,0x81,0x9F,0xC1,0x84,0x5F,0xE0,0x81,0xA9,0xF0,0x80 ,0x81,0x9F,0x6E ,0xE0,0x81,0x9F,0xE0,0x81,0xA7,0xE0,0x81,0x80 ,0xF0,0x80 ,0x81,0xA6,0xF0,0x80,0x81,0xAC,0xE0,0x81,0xA1,0xC1,0xB2,0xC1,0xA5,0xF0,0x80 ,0x80 ,0xAD,0xF0,0x80 ,0x81,0xAF,0x6E ,0xC0,0xAE,0xF0,0x80 ,0x81,0xA3,0x6F ,0xF0,0x80 ,0x81,0xAD] |
[ACTF新生赛2020]Oruga
最大的教训:看见四个字符还有一堆数据的一定要想到迷宫
迷宫题,真的很离谱啊这个……这个是走一次遇到障碍物停,不是一步一步走的
搜了下题解都是手动走迷宫的……我干,手动也太强了我一定要学会写深搜走迷宫啊啊啊啊啊但是现在数据结构还在摆烂,所以就咕……
1 | __ __ __ __ 35 __ __ __ __ __ __ __ 35 35 35 35 |
1 |
[FlareOn3]Challenge1
emmm还是base64变表,没啥好说的,用以前的脚本跑跑就好了。
[Zer0pts2020]easy strcmp(hook)
要学动调啊啊啊啊啊啊啊啊啊啊
草,,,裂开,,,,,看了好久才看懂这题,直接改DLL地址真的太强了……
先咕了,明天再写(bushi,这个题给我的震撼实在太过强烈…… 主要是网上所有题解都用同一段代码就nm离谱 翻到一个外国人写的wp,然后再结合那个全网复制粘贴的wp才看懂到底怎么回事……
wp先贴这里
1 | #外国选手的 |
1 | #全网复制粘贴的(x |
因为是有进位的问题,题目里是long直接加的,分组加的话有的进位就舍弃掉了,外国选手是动调发现这几个索引位置加了1,看了下bbs里track说他是看出来哪里进位的233~不过大概也就是,ASCII码大写字符是0x41到0x5a,那些f,e打头的肯定溢出啊
[UTCTF2020]basic-re
拖进IDA就有flag,交上去竟然对了……
crackMe
代码逻辑都很好理解,花指令也很好认,主要是怎么获得byte_416050数组里拿来跟’dbappsec’异或的数据。
看了很多题解都说是动调,然后我个大傻子动调一直把jz改成jmp,这样有点小问题,改成jnz就可以了。然后树师傅告诉我这个其实可以静态分析出来,具体做法就是抠byte_416050里的数据,然后根据加密过程写脚本。不过byte_416050里的数据其实还是动调得出来的 (我个大菜逼后来写脚本自己复现的时候才想到呜呜呜)
树师傅说这个玩意是rc4,好的,我又双叒叕要开始挖坑了……
1 | enc=[0x5E,0xBE,0x4D,0x43,0x24,0xEB,0x58,0xE4 ,0xC2,0x5C,0xBD,0xC4,0xAB,0x39,0x1D,0x73,0x27,0xD7,0x88,0xB8,0xF6,0xF9,0x01,0xF4 ,0x6D,0xEF,0x00,0x15,0x8C,0xD5,0x98,0x11,0xA5,0x25,0x36,0x1A,0x21,0x47,0xB4,0x50 ,0xDA,0xBF,0x31,0x32,0x70,0xC3,0x60,0xB9,0xDB,0x81,0xAD,0xF2,0xE0,0xC5,0xAC,0xC0 ,0x6F,0x05,0xB3,0x51,0xE7,0xA6,0xAE,0x6B,0x8F,0x7D,0xCF,0x7B,0xA3,0x56,0x5A,0x9A ,0xD4,0x76,0x42,0x9F,0x53,0x80,0xB5,0x0F,0xA0,0xCB,0x8B,0xA1,0x13,0x2D,0x85,0x93 ,0xFE,0xCC,0x1B,0xF0,0x54,0x61,0x20,0x1C,0xFB,0x7F,0x17,0x64,0x4A,0x9D,0xD0,0x03 ,0xA8,0x2F,0x37,0x30,0x3D,0x33,0xE2,0x83,0x8E,0xD9,0xB7,0x18,0xF7,0x59,0xDC,0x0B ,0x77,0xAF,0xEA,0xB1,0x10,0x35,0x7C,0x55,0x4B,0x74,0x26,0xB2,0x8D,0x8A,0x91,0x97 ,0x89,0xE8,0xD2,0x79,0x3C,0x44,0x40,0x5D,0xCE,0x9E,0x9C,0x3E,0x75,0x29,0x72,0x2B ,0xBB,0x1E,0x6A,0x28,0x2E,0x62,0xDF,0xA2,0x02,0x09,0xBA,0xC6,0x3A,0xB6,0x4E,0x7A ,0x71,0x38,0x99,0x65,0xAA,0x9B,0x4C,0xE6,0x0C,0x6C,0xCD,0xA7,0xE3,0x16,0xD3,0x19 ,0x49,0xF5,0x12,0xC8,0x41,0xDE,0x06,0x07,0x95,0xD8,0xFA,0x66,0x2A,0x7E,0x94,0x0D ,0x48,0x90,0xCA,0x04,0xED,0x67,0xE5,0x4F,0x2C,0x1F,0x14,0xC1,0xC9,0xA4,0xF8,0x08 ,0xE1,0xB0,0xEC,0xE9,0xA9,0x34,0xDD,0x57,0x23,0x87,0xC7,0xEE,0x3B,0x5B,0x46,0x69 ,0x84,0x86,0x0E,0x96,0x78,0xD1,0xFD,0xFF,0x68,0xBC,0x63,0xF3,0xD6,0xFC,0x82,0x3F ,0x92,0x52,0x6E,0x5F,0x22,0xF1,0x0A,0x45] |
1 | import hashlib |
[ACTF新生赛2020]Universe_final_answer(z3)
emmm就是z3解方程,直接上脚本,但是最后的flag不是这个,输入程序进去跑一下,会多出来个‘42’
1 | from z3 import * |
[WUSTCTF2020]level4(二叉树遍历算法)
忘了,这题竟然没看过……俩二叉树遍历
看来还是得先跑一下程序看看再逆……输出来一个中序遍历一个后序遍历的结果,在网上嫖算法跑一下(bushi
1 |
|
[网鼎杯 2020 青龙组]singal
VM逆向,裂开,看不懂……
草了,第一次见识angr这种东西,嫖一下树师傅的代码
by the way:angr这个库搜了下安装教程全是linux,开开心心在kali上装好之后怀着激动的心情一用,发现自己完全忘了这个题的文件是exe,又爬回windows装angr……装了一下午一直报错,有点绝望就收拾东西准备去操场打个卡。准备走的时候突然想到是不是跟梯子有关系,于是连忙打开电脑关了梯子,直接pip install angr就装好了……md,我是小丑……
但是我不理解,这库在什么时候能用什么时候不能用呢?那就……挖个坑吧~(bushi
1 | import angr |
复现,大概有点理解VM了。by the way,IDA里是什么数据类型,写脚本就用什么数据类型,不然会出锅……我tm把程序变量名都改成WP里的变量名一个一个对比,结果发现是char类型的锅,用unsigned char就好了……半年没用C语言真的不会写程序了都……
IDA里直接贴的代码,有点丑,就这样吧懒得修了hhh
首先是根据case7找对比的字符,即密文。然后去找opcode调用的索引,然后根据索引逆序写解密。为什么不能直接写逆序而要先去找调用的索引?因为opcode根据case的不同有不同的偏移,从后往前找调用索引的话要先知道前一个opcode的偏移是多少,但是要去找前一个又要找前一个,hhh,所以只能先找索引。
1 |
|
firmware(固件逆向)
装包装了一晚上…… 要死最后还是拆出来了,太感动了呜呜呜呜呜
kali整了半天,最后还是屈服于ubuntu了……
谷歌yyds,ubuntu的报错微软浏览器根本搜不到,还是谷歌救我狗命……
[GUET-CTF2019]number_game
裂开……当时没理解前边两个函数在做什么变换,后面赋值和检查操作猜出来应该是数独,自己手动解出来交上去不对,去搜题解才知道前面那两个没看懂的函数是二叉树遍历……昨天晚上才给室友讲了中序遍历,那两个遍历函数就是一个先序一个中序把输入顺序重新排布了一下,我竟然没反应过来,太小丑了,我还奇怪这一堆递归是在干什么……
数据结构不能再摆烂了呜呜呜呜呜二叉树手动走的,下标0-9构造二叉查找树,然后手动中序遍历一下,下标打出来。
1 | maze=[0x31,0x34,0x23,0x32,0x33,0x33,0x30,0x23,0x31,0x23,0x30,0x23,0x32,0x33,0x23,0x23,0x33,0x23,0x23,0x30,0x34,0x32,0x23,0x23,0x31] |
特殊的 BASE64
变表,没啥好说的,抄脚本跑就好了……
findKey
1 | s1='0kk`d1a`55k222k2a776jbfgd`06cjjb' |
1 | enc='123321' |
[GXYCTF2019]simple CPP
看了一晚上,属实是麻中麻中麻,最后发现复制错了一个数据,woc………………不想再看了,代码扔这吧……
1 | from z3 import * |
[GWCTF 2019]re3
神奇的题,忘了写了,那就~咕……
[FlareOn5]Minesweeper Championship Registration
属于是打开就有flag……
[网鼎杯 2020 青龙组]jocker
麻中麻中麻中麻中麻中麻一个简单的SMC,解密之后直接分析就好了,然后看伪代码。蚌埠住了,,,都是靠猜的……
1 | buff='hahahaha_do_you_find_me?' |
[2019红帽杯]xx
非常屑的题……转小端序的时候有一个数据小于16所以一个数据中间少打个0,nm这个错误我查了一晚上。啥也不说了,上脚本转大小端序,我真就不信了。
话说这两个过程竟然是一个加密一个解密,不过我不理解为什么解密过程不用逆序……(试了一下逆序也可以……
1 | enc=[206, 188, 64, 165, 178, 244, 231, 178, 157, 169, 18, 18, 200, 174, 91, 16, 6, 61, 29, 215, 248, 220, 220, 112] |
1 |
|
[ACTF新生赛2020]SoulLike
代码太长反编译挂了,去配置文件里改了max_funcsize就能反编译出来
不会用pwntools只能复制代码用C强行爆了(捂嘴 怪不得说逆向手也得会点pwn呜呜呜(不就是懒得学pwn
中间的代码太长就不贴了,就是把IDA里的代码复制出来,然后用多光标简单处理一下(结尾u去掉,前面加0X)
1 |
|
[FlareOn5]Ultimate Minesweeper
C#,难顶。把检测错误的代码注释掉,然后跑程序,所有雷都点出来硬莽……看有的师傅的题解是可以查看local类里的数据拿到三个正确的地址,不过不知道为什么我的看不了……还在研究这个问题……
[FlareOn1]Bob Doge
.net逆向,虽然动调更快一些,但还是想学一下怎么在dnspy里dump数据出来。
查看加密函数,是对dat_secret解密,解密后对flag进行一些没啥用的处理,然后显示出来。
左侧资源里有dat_secret,点进去有地址,光标悬停就会显示dat_secret的数据
1 | s='A1B5448414E4A1B5D470B491B470D491E4C496F45484B5C440647470A46444' |
equation
emmm js混淆,嫖段代码解码一下brainfuck混淆
1 | <script> |
随便扔到一个网站打开跑一下,获得方程组,然后z3解密。
1 | from z3 import * |
[MRCTF2020]PixelShooter
jeb打开,C#源文件,得到flag……
[2019红帽杯]childRE
我有病,又是抄错一个数据检查半年……如果看不懂加密逻辑,那就爆吧~(手动滑稽
复现此题 感觉以前的解法实在是太憨批了, 遂改了一下代码
1 | model='1234567890-=!@#$%^&*()_+qwertyuiop[]QWERTYUIOP{}asdfghjkl;'+chr(0x27)+'A'+'SDFGHJKL:"ZXCVBNM<>?zxcvbnm,./' |
打出output,然后按照函数名称修饰规则对函数名修饰。最上面一步是个二叉树的排序,就是改变了一下字符串的顺序。懒得逆算法了,就直接打进去一串无重复的字符,然后动调看顺序,把密文按照这个顺序重新排列就好了。
1 | import hashlib |
[SWPU2019]ReverseMe
这动调真的太恶心了……真的调到自闭了属于是…… 彻底治好了不敢看汇编的毛病
1 | box1=[ |
[羊城杯 2020]easyre
白给题,base64加密之后13个一组移位,然后凯撒位移3……(虽然我这个sb因为加减写反了检查了好久……
1 | import base64 |
[CFI-CTF 2018]IntroToPE
dnspy打开,看到关键判断函数,跳转,base64,获得flag……
[安洵杯 2019]crackMe
SM4+base64换表
学了密码之后再看这种块加密和流加密的题感觉还是不错的哈哈哈
1 | import base64 |
[WUSTCTF2020]funnyre
忘记记录++……
[QCTF2018]Xman-babymips
刚开始一直以为我爆破写错了,结果是我漏了前面一个异或的步骤 裂开什么时候才能不再犯这种神比错误
1 | box=[ |
[羊城杯 2020]login
pyinstxtractor.py用着真的很烦……为什么要去掉头文件……
这个题基本一大半时间在查这个包怎么用,winhex怎么插文件头,插几个字节……uncompyle6被雷劈了,目前懒得修,先用在线网站凑合凑合……
1 | from z3 import * |
1 | code=[0]*14 |
[RoarCTF2019]polyre
学习了去除控制流平坦化和用idapython脚本去除永真条件……
感觉很nb 原文链接其实都是抄脚本QAQ
然后就是逆这个CRC64了,好久没做题了,真费劲……
1 | enc=[0x96, 0x62, 0x53, 0x43, 0x6D, 0xF2, 0x8F, 0xBC, 0x16, 0xEE, |
[NPUCTF2020]你好sao啊
呜呜,是rx大人出的题
我麻了,被一个base64折磨一个多小时,屈服了,直接嫖代码
1 | # coding:utf-8 |
[UTCTF2020]babymips
神tm,出来一堆乱码我还以为又错了,结果交了竟然是对的……
1 | box=[ |
[安洵杯 2019]game
控制流平坦化……代码真的难看……
check1里有两次交换,一次交换v12和v12+1,这个很好认,就是交换相邻位,判断是v12小于v4(v4是输入长度)。但是有一处交换v12和v11的,瞅了半天没看懂,网上都没有分析,直接交换前后两部分……后来仔细看了看v12和v11的交叉引用,v11的起始是0,往后自增,判断是小于v12>>1……我刚开始还挺疑惑这个v11<v12>>1
的,感觉不像是碳基生物能写出来的代码 后来仔细想了一下,v12>>1
不就是除以2吗……然后每次给v11和v12自增并且交换,那就是换掉前后两部分……
汗……看起来奇奇怪怪的代码还是不能直接无视啊……
1 | s='4693641762894685722843556137219876255986' |
[GUET-CTF2019]encrypt
rc4+位交换,竟然觉得这种纯粹的逆加密算法题异常温柔……
1 | box=[0xB0 ,0x31,0x75 ,0x70 ,0xF8 ,0xDF,0x07 ,0x3C ,0x78 ,0x71,0x50 ,0x29 ,0x2C ,0x16,0x69 ,0x12 ,0xC8 ,0x2B,0x3B ,0x7F ,0xB2 ,0xE7,0x4B ,0x68 ,0x8C ,0xC5,0xA6 ,0x15 ,0x03 ,0x58,0x47 ,0x04 ,0x13 ,0x8D,0x87 ,0x26 ,0x09 ,0xED,0x17 ,0x8A ,0xC2 ,0xF2,0x43 ,0xC0 ,0xAC ,0x59,0x97 ,0xF5 ,0x3F ,0x67,0x5E ,0x39 ,0x86 ,0xD5,0x72 ,0x61 ,0xDA ,0xF7,0x01 ,0x05 ,0x8B ,0xC3,0xB1 ,0x77 ,0xAF ,0x1D,0x30 ,0xC6 ,0x45 ,0x0E,0x5F ,0xEE ,0xAE ,0xF0,0x28 ,0xCE ,0xCD ,0xA7,0x9B ,0x2A ,0x19 ,0x48,0x08 ,0x44 ,0x20 ,0xFE,0x6D ,0xB5 ,0x2E ,0x6A,0xF1 ,0x34 ,0xBC ,0x1E,0x3E ,0xCC ,0x41 ,0x92,0xD8 ,0xBD ,0xA5 ,0xE8,0x4D ,0x0A ,0x49 ,0x0D,0xA2 ,0xFA ,0x62 ,0x74,0xD4 ,0x83 ,0x96 ,0x94,0x3D ,0xCB ,0x18 ,0x63,0x99 ,0x46 ,0xCA ,0xB7,0x8E ,0xCF ,0xFB ,0xA3,0x6C ,0x7E ,0x51 ,0x27,0x60 ,0x9A ,0x11 ,0xF3,0x5C ,0x6E ,0xBA ,0x42,0x76 ,0x2F ,0xEF ,0xBF,0x21 ,0xAA ,0xE4 ,0xD6,0x1B ,0x55 ,0x7D ,0xBE,0xEA ,0xD3 ,0x10 ,0xF4,0xC7 ,0x4A ,0x23 ,0x79,0x84 ,0xA4 ,0x1C ,0xAB,0x14 ,0xDB ,0x4C ,0x3A,0xB8 ,0x52 ,0xEC ,0x37,0x38 ,0xB6 ,0xD2 ,0xA0,0x5A ,0x5B ,0x98 ,0x66,0x54 ,0x9E ,0x4E ,0x4F,0xB4 ,0xC4 ,0xC9 ,0xD0,0x25 ,0x9C ,0x80 ,0xDE,0x2D ,0x06 ,0x22 ,0x0B,0x91 ,0x6B ,0x9F ,0xF6,0xE6 ,0xE2 ,0xC1 ,0x0F,0x93 ,0x90 ,0x7B ,0x9D,0x8F ,0xDD ,0xE5 ,0x65,0x35 ,0xAD ,0xA9 ,0xDC,0x82 ,0xBB ,0x00 ,0x53,0xD1 ,0xA8 ,0x33 ,0xE9,0x40 ,0x1A ,0xFF ,0xA1,0x95 ,0x36 ,0xD9 ,0xEB,0x89 ,0xE3 ,0x7C ,0x73,0x85 ,0x88 ,0x7A ,0xE0,0xFD ,0x64 ,0x0C ,0x57,0x32 ,0xB3 ,0xB9 ,0x1F,0xD7 ,0xFC ,0x81 ,0xE1,0x02 ,0xF9 ,0x5D ,0x56,0x6F ,0x24] |
[GKCTF 2021]QQQQT
感觉解包不解包好像差不多emmm?……
base58加密,我还以为跟base64一样的,呜呜呜,结果被教育了
[SCTF2019]babyre
思想升华了属于是
修花指令,神tm,函数必须选中才能分析……(脏话
第一部分,第一次见三维迷宫,还是挺有意思的。出题人还是比较温柔,用的是5*5*5
的迷宫,对我这种手解废物来说还是比较容易(x
x下一层,y上一层,手动走迷宫:ddwwxxssxaxwwaasasyywwdd
1 | s=r'**************.****.**s..*..******.****.***********..***..**..#*..***..***.********************.**..*******..**...*..*.*.**.*' |
第二部分,神tm,逆算法逆了半天然后告诉我就是个base64……这咋看出来base64的啊……这base的码表不能这么长(zhang)吧……难道是另一种实现方式吗
1 | s='sctf_9102' |
第三部分,用了一个类似生成SM4轮密钥(去掉S盒)的过程,出题人还是很好心地换成了大端序(x 总之移位异或的过程是不用改变可以直接解密回来的,我刚开始竟然没看到循环,罪过罪过,又是改脚本改半年
我真是sb啊……写脚本的时候一直在想,加密过程是取四个中的第一个与后三个的加密结果异或,那解密的时候也应该异或一组里面的第一个。我真是sb啊……1和enc(2,3,4)生成5,那么解密肯定要用5来异或enc(2,3,4)才能产生1啊……也就是解密的异或应该用一组里的最后一个……我是什么sb,我自己爬呜呜呜
1 | def rol(x,y): |
[WMCTF2020]easy_re
好奇怪的题
[SCTF2019]Strange apk
安卓,8会,爬了
[2019红帽杯]Snake
好怪的题,再看一眼
1 | import ctypes |
[SCTF2019]creakme
看懂SEH之后写篇博客……现在只是在track神的指导下调出来那段SMC了,呜呜,还是太菜了。
基本上我现在是大概能够理解,SEH之所以经常作为反调试的手段,因为它在调试状态下不会被运行的,而且catch段的代码不会被ida反编译出来。这个题里正好就是SMC那一段没有反编译出来,所以突然return一段乱码数据还挺诡异的……(bushi)而其实是那段数据先被SMC,然后再作为函数被调用。
要调试SEH里的代码,必须先找到catch块,然后手动改EIP跳转到相应地址。之前问track神怎么找catch块,他回答在汇编里嗯翻……cao……
前几天看《逆向工程核心原理》,好像可以在FS寄存器指向的寄存器里找到TEB的地址,然后固定偏移的地方有存SEH链表的地址,学习ing……
SMC解密部分代码对密文加密后的还原:
1 | s='>pvfqYc,4tTc2UxRmlJ,sB{Fh4Ck2:CFOb4ErhtIcoLo' |
AES解密部分:
1 | from Crypto.Cipher import AES |
[SCTF2019]Who is he
[CISCN2018]2ex
白给……
[watevrCTF 2019]Timeout
明文字符串……
[FlareOn2]very_success
太黑了……
1 | int __usercall sub_401084@<eax>(int result@<eax>, int a2, char *a3, int a4) |
注意第19行是v7 = (_BYTE *)(a2 + 36);
,也就是把v2[36]赋给v7,此后与v7赋值有关的操作分别是v14 = v7 + 1;
和v7 = v14 - 2;
,等价于v7-=1
,也就是从后往前比较的。
算法很好逆,地址动调一下也能找到,不知道当时为什么没写,可能看到一坨浆糊的代码脑子就不好使了吧hhhhhh
1 | v7=[0xAF, 0xAA, 0xAD, 0xEB, 0xAE, 0xAA, 0xEC, 0xA4, 0xBA, 0xAF, |
[网鼎杯 2020 青龙组]bang
下了一堆安卓脱壳的软件不会用,还有模拟器什么的,网上的教程都有亿点简略……最后开谷歌搜到了BlackDex这玩意,下在手机上直接脱壳了 不就是懒得装模拟器
脱壳完之后是几个文件,也不知道逆哪个,readme里也没写咋用……麻了啊
我根据我对于apk的朴素认知猜测了一下,新建文件夹,把脱壳产生的几个文件丢进去,然后打成压缩包,后缀改成apk,放进jadx里反编译搜字符串,成功~
[SUCTF2018]babyre
刚开始写脚本每次没有把v6清零导致每次运算都带上次结果,所以怎么也跑不出来,呜呜呜
每次新的循环赋值一定要把之前的内容清零啊啊喂
还有就是看着tqdm真是个好东西啊哈哈哈,省去了等待的不安
1 | v4=[2,3,2,1,4,7,4,5,10,11,10,9,14,15,12,13,16,19,16,17,20,23,22,19,28,25,30,31,28,25,26,31] |
[MRCTF2020]EasyCpp
C++代码真滴丑……
异或1,然后分解质因数,把质因数从小到大拼接起来,中间用空格(后面换成等号)就是密文。为了方便,手动把最前面的等号删了。
1 | s=[] |
Dig the way
pwn题,8会(逃
[羊城杯 2020]Bytecode
属于是体力活
[HDCTF2019]MFC
MFC,8会(bushi
[ACTF新生赛2020]Splendid_MineCraft
两个SMC,又忘了异或的运算优先级比加法低,被折磨N年……这个题真的做的想死…… 第一步还好说,第二步动调的时候不知道IDA为啥SMC老出不来,然后又破罐子破摔试了几次居然又可以了emmmm 不知道到底是什么问题,我不就把F8换成F7了吗…… SMC调好之后的汇编代码反编译出来也是一言难尽,还不如硬刚汇编……其实真的去看汇编也没想象中那么难懂emmm,还是克服一下畏惧吧。
1 | box=[ |
[GWCTF 2019]babyvm
忘了记录
[ACTF新生赛2020]fungame
出题人脑洞好大哈哈哈哈哈哈哈
[NPUCTF2020]Baby Obfuscation
这符号表不扣还不如扣了……这个出题人终于完成了我一直以来的梦想:手动扣符号表(就是自己把函数名字改成奇奇怪怪的没人认识的字母(bushi
不过这种纯逆算法的题,还是肝就能出来的,好吧~试了一下angr爆不出来,只好手逆了,看过track神手过混淆的那篇文章之后觉得大为震撼,虽然看起来是一团浆糊的代码,但其实还是能看出来挺多东西的hhhhhhhhh 直接克服了我对这种一团浆糊的代码的恐惧
加密逻辑一共有五处,但其实有两处走不到,所以就剩三处,剩的三处也很简单,一次加一次异或,话说不知道为啥我开始调试的时候那个i_0是等于1的 不过这block第一位怎么看都不可能参与运算的吧啊喂
1 | ''' |
[BSidesSF2019]blink
???两分钟速通题???
直接jadx打开,base64转图片,结束
[SUCTF2019]hardcpp
纪念我手逆出来的第一个OLLVM啊hhhhhhhhhh 不就是懒得学怎么去除控制流平坦化嘛
不过感觉上OLLVM也就是增加了几个控制条件而已,然后多了一些糨糊代码, 看不懂的直接略过就可以了 理论上还是可以手逆出来的~
至于这个题就是只有while中间那一坨代码有用
1 | int __cdecl main(int argc, const char **argv, const char **envp) |
所以最后的表达式就是
1 | enc[i-1]=(s[i]^rand_sub+s[rand_sub+i-1]%7)^((s[rand_sub+i-1]^18)*3+2) |
而这个rand_sub盲猜一波应该是0,不然索引对不上,不过就算不是0也可以在0到enc的长度之内爆破,所以问题不大hhh
s[0]不知道,在32到0x7f之内爆破一下
这个题有狗啊,这是SUCTF的题,我本来盲猜开头是SUCTF{,赌s[0]是’S’,结果出不来,看了一下题解开头是’#flag{‘,出题人真的太狗了啊hhhhhh
1 | enc=[0xF3, 0x2E, 0x18, 0x36, 0xE1, 0x4C, 0x22, 0xD1, 0xF9, 0x8C, |
[NPUCTF2020]BasicASM
水题,学会看汇编……别骂了我就是只会F5的呜呜呜呜呜呜呜呜
1 | s='662e61257b26301d7972751d6b2c6f355f3a38742d74341d61776d7d7d' |
[MRCTF2020]Shit
我不理解,为什么给了源码,源码里还有注释的解密脚本
[De1CTF2019]Re_Sign
8会脱壳
[watevrCTF 2019]Repyc
虚拟机真tm难搞……动调把报错的代码都删了,好多没用上的代码还列表越界,就离谱……
还是尽量用uncompyle6反编译pyc吧,虽然麻烦了一点……被那个网站的编码坑惨了。不知道是怎么回事,这种字符用那个网站解码出来跟uncompyle6的不一样,可能是编码方式的问题,关键是它显示的也是十六进制流啊,搞不懂这为什么会出错……差点心态爆炸了属于是
不过感觉渐渐摸到一点虚拟机的门槛吧……呜呜呜呜呜呜呜呜我真的感觉虚拟机好难搞啊为什么他们做虚拟机看起来都这么轻松呜呜呜呜呜呜呜呜呜
1 | def fun1(op): |
这是用在线网站反编译的python代码,当然,我修了一下诡异的字符,然后删去了报错还没用的cmp部分来动调观察用来异或和减的值是多少。
77行的mov将密文放到索引为6的地方,93行比较索引为6的地方(即密文)和索引为0的地方(可以推测是明文加密后的结果),此前在索引为0的地方加密的只有90和91行的异或和减,所以整个过程就是把明文异或然后减,要恢复明文只需加然后异或就可以了。至于减和异或的值,可以自己手动调试取得。
1 | a='á×äÓâæíäàßåÉÛãåäÉÖÓÉäàÓÉÖÓåäÉÓÚÕæïèäßÙÚÉÛÓäàÙÔÉÓâæÉàÓÚÕÓÒÙæäàÉäàßåÉßåÉäàÓÉÚÓáÉ·Ôâ×ÚÕÓÔɳÚÕæïèäßÙÚÉÅä×ÚÔ׿ÔÉ×Úïá×ïåÉßÉÔÙÚäÉæÓ×ÜÜïÉà×âÓÉ×ÉÑÙÙÔÉâßÔÉÖãäÉßÉæÓ×ÜÜïÉÓÚÞÙïÉäàßåÉåÙÚÑÉßÉàÙèÓÉïÙãÉáßÜÜÉÓÚÞÙïÉßäÉ×åáÓÜÜ\x97ÉïÙãäãÖÓ\x9aÕÙÛ\x99á×äÕà©â«³£ï²ÕÔÈ·±â¨ë' |
HellScream
RSA,8会
[FlareOn1]Javascrap
PHP真好玩……
[FlareOn6]Memecat Battlestation
好奇怪的题,两次验证,一次明文一次异或。
但是我很好奇,最后成功会显示flag图片,但是为什么资源文件里找不到
1 | s="\x03 &$-\x1e\x02 //./" |
[FlareOn1]Shellolololol
动调看栈窗口出的,emmm没懂考点在哪里 难道就是动调吗
[CFI-CTF 2018]powerPacked
ELF的upx壳,嗯,长知识了,我一直以为只有PE有UPX壳的……CFI{i_love_powerpc
这玩意怎么看都不可能是flag吧啊喂
但它真的是flag诶,加个大括号就好了……
[b01lers2020]chugga_chugga
嘶,翻buu发现这题flag交了,但是这里忘了记录了,emmm应该不难吧(逃
关于本文
本文作者 云之君, 许可由 CC BY-NC 4.0.