题目有点多,放在一篇里面太过臃肿,所以多分了几篇
IgniteMe
IDA打开,首先发现flag的格式,EIS{***}
找到关键函数
1 | bool __cdecl sub_4011C0(char *a1) |
据此写脚本逆向
1 | #include <iostream> |
把输出和我们已知的部分结合起来得到flag
1 | EIS{wadx_tdgk_aihc_ihkn_pjlm} |
hackme
通过字符串找到关键部分
1 | __int64 __fastcall sub_400F8E(__int64 a1, __int64 a2) |
就是个简单的运算,写个脚本逆运算一下就出来了
1 | #include <iostream> |
输出flag
1 | flag{d826e6926098ef46} |
easyre
还是通过字符串找到关键函数
1 | int sub_401080() |
里面的算法变得复杂而毫无意义,真正实现的功能就两个,首先将输入的字符串逆序,然后进行一个变换,最后得到已知的字符串
1 | target='xIrCj~<r|2tWsv3PtI\x7Fzndka' |
输出flag
1 | flag{xNqU4otPq3ys9wkDsN} |
shuffle
打开把所有的整数转换为字符就看到了flag
1 | SECCON{Welcome to the SECCON 2014 CTF!} |
re-for-50-plz-50
这题是MIPS,IDA直接反编译不出来,MIPS指令学的也不是很好,所以直接用retdec插件
retdec直接反编译出来
1 | int main(int argc, char ** argv) { |
可以发现只有一个异或操作
1 | target="cbtcqLUBChERV[[Nh@_X^D]X_YPV[CJ" |
输出flag
1 | TUCTF{but_really_whoisjohngalt} |
parallel-comparator-200
代码审计,直接给出了源码
1 | #include <stdlib.h> |
源码比较长,但是做的事情不多,需要注意三个函数的用法
第一个是pthread_create()
用来创建一个新的线程
1 | int pthread_create(pthread_t *tidp,const pthread_attr_t *attr,(void*)(*start_rtn)(void*),void *arg); |
几个参数分别是,指向线程的指针,线程的属性,调用的函数和参数,在这段代码里实际上就是调用checking()
函数,并把之前设定好的参数传给函数
第二个是pthread_join()
用来传递返回结果
1 | int pthread_join(pthread_t thread, void **retval); |
所以result就是指向返回结果的指针,所以最终的目的就是让checking()
函数返回的值为0
第三个是random()
函数,在这之前没有用随机种子初始化生成器,所以随机数生成的结果不管怎么运行都是一样的,但是需要注意linux下random()
和windows下rand()
生成的数据并不一样
此外还需要注意一点,在c++里面,赋值语句的返回值是赋的值而不是布尔值
所以只需要根据checking()
函数来逆向运算一下就可以得到结果了
1 | #include <iostream> |
输出flag
1 | lucky_hacker_you_are |
secret-galaxy-300
题目里面只有一个结构体,运行了一遍什么都没发现,OD调试的时候查找字符串找到flag
1 | aliens_are_around_us |
srm-50
这题是个简单的注册机,找到关键函数
1 | BOOL __stdcall DialogFunc(HWND hDlg, UINT a2, WPARAM a3, LPARAM a4) |
过程十分简单,先简单判断邮箱是不是符合格式,如果符合进入序列号的判断,序列号的判断关键也就只有一个if条件,然后就会输出注册有没有成功
1 | #include <iostream> |
输出结果为
1 | CZ9dmq4c8g9G7bAX |
Mysterious
通过字符串找到关键函数
1 | int __stdcall sub_401090(HWND hWnd, int a2, int a3, int a4) |
发现我们只要输入122xyz,就会输出flag,而且flag也可以直接拼凑出来
1 | flag{123_Buff3r_0v3rf|0w} |
re1-100
这题题目里面的if实在是太多了,主要是为了判断是不是有debugger,所以不能通过调试的方式获得flag,所以还是要研究一下代码
1 | if ( strlen(bufParentRead) == 42 ) |
截取了其中一段,这里把flag分成了4个部分,每段10个字符,已经知道第一段地最后一段,但是也知道经过confuseKey()
之后flag是什么,所以我们只要研究一下confusekey()
就可以了
1 | bool __cdecl confuseKey(char *szKey, int iKeyLength) |
内容挺多,实际上只实现了一件事情,把四段调换了一个顺序,变成了3421的顺序,所以调整一下顺序就出来了
1 | 53fc275d81053ed5be8cdaf29f59034938ae4efd |
crazy
这题c++17编写,还有类,乍一看有点复杂,但实际上不是很难
还是先看关键函数,这里在main函数里就进行了处理
1 | int __cdecl main(int argc, const char **argv, const char **envp) |
乍一看很复杂,慢慢分析,发现了一个输入,被赋值给了v18
,然后发现一个类的构造函数调用了我们输入的字符串,可以理解为,用我们的字符串初始化了类中的数据成员,进去仔细看看
1 | nsigned __int64 __fastcall HighTemplar::HighTemplar(DarkTemplar *a1, __int64 a2) |
从这里看,类里面至少应该有一个getSerial()
函数在off_401EA0
处,三个字符串,偏移量分别为16,48,80,长度都是32位,还有一个布尔型变量,偏移量位3,并且我们还知道,我们的数据被传入了一个变量v23
里,然后返回去,跟踪v23
,找到剩下的关键函数
1 | bool __fastcall HighTemplar::calculate(HighTemplar *this) |
这一看就是个加密函数,并且只对偏移量位16处的字符串进行了操作,这里正好是我们输入的字符串,虽然有两个for循环,但是都是对同一个字符串的同一个位置进行操作,很好逆向,加密完之后应该还会有一个验证,找到下面的验证函数
1 | __int64 __fastcall HighTemplar::getSerial(HighTemplar *this) |
这个函数不长,很简单的验证了加密过后的字符串和偏移量位80的字符串是不是一样,用偏移量位3处的布尔值作为返回值,如果相同返回0,回到主函数,接下来就成功了,没有其他的变换和判断,所以这个程序实际上非常简单
1 | target = "327a6c4304ad5938eaf0efb6cc3e53dc" |
很简单就可以逆向出,套上flag{}
提交即可(这个flag长得实在不像是正确的)
1 | flag{tMx~qdstOs~crvtwb~aOba}qddtbrtcd} |
re4-unvm-me
pyc格式,直接uncompyle6反编译,成功,没有对pyc文件动什么手脚,反编译后的源代码如下
1 | import md5 |
发现给出了很多md5,把flag每5个字符一组,算出md5要和给出的相同,所以用这些md5在线解密
组合起来就是flag
1 | ALEXCTF{dv5d4s2vj8nk43s8d8l6m1n5l67ds9v41n52nv37j481h3d28n4b6v3k} |
anser_to_everything
IDA打开
1 | int __cdecl main(int argc, const char **argv, const char **envp) |
找到了一个字符串kdudpeh
,根据题目提示,sha1加密得80ee2a3fe31da904c596d993f7f1de4827c1450a
套上flag得
1 | flag{80ee2a3fe31da904c596d993f7f1de4827c1450a} |
elrond32
IDA打开,main函数如下
1 | int __cdecl main(int a1, char **a2) |
我们得输入作为main函数得参数传入,在sub_8048414()
函数中进行了一个判断,然后进入sub_8048538()
函数处理后输出flag
1 | signed int __cdecl sub_8048414(_BYTE *a1, int a2) |
判断得过程是一个递归,因为返回值要为1,所以递归过程中得每一个if都需要满足,所以很好得到输入的字符串是什么
1 | int __cdecl sub_8048538(int a1) |
输出部分只进行了一个很简单的处理,而且不需要逆向,直接用同样的方式处理即可
1 | targrt = 'ie_ndags_r' |
输出flag
1 | flag{s0me7hing_S0me7hinG_t0lki3n} |
Comments