ctf 逆向 暴力破解类的脚本
前言:在分析代码的时候常遇到不好逆向的逻辑,如求余(%)等,下面就是含有求余的两道逆向题目
例题一:buuctf [ACTF新生赛2020]rome1.查壳
无壳32位exe.2.ida32打开并分析main函数发现主要函数 func()
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899int func(){ int result; // eax int v1; // [esp+14h] [ebp-44h] int v2; // [esp+18h] [ebp-40h] int v3; // [esp+1Ch] [ebp-3Ch] int v4; // [esp+20h] [ebp-38h] unsigned __int8 v5; // [ ...
BUUCTF(re8~re9)
re8:reverse31.下载附件并查壳32位无壳2.用ida32打开并查看字符找到关键函数,并且注意到abcd……(很有可能用到了base64加密)跟进查看伪c代码流程大概就是:输入一段字符串,然后经过sub-4110BE函数,再每位减去自己的下标值,再和str2比较。下面再带着思路去看函数内容很明显是base64加密,所以下面就剩脚本了脚本如下:
123456import base64d='e3nifIH9b_C@n@dH'c=''for i in range(len(d)): c+=chr(ord(d[i])-i)print(base64.b64decode(c))
所以flag{i_l0ve_you}
re9:不一样的flag1.下载附件并查壳32位无壳2.用ida32打开并查看字符
从这个程序中可以猜测这是个迷宫问题,前面有写过一次
ida32打开发现类似地图的字符找到main函数查看伪c代码跟进_data_start__发现就是这段字符串*11110100001010000101111#拿着应该就是地图了,方向在程序里也找到了 ...
BUUCTF(re1~re6)
re1:easyre1.下载附件并查壳
64位exe2.ida64打开并查看字符
找到“答案”flag{this_Is_a_EaSyRe}
re2:reverse11.下载附件并查壳64位,无壳2.用ida64打开,查看字符
找到关键字符,跟进并查看伪c代码发现跟进str[2]{hello_world}把o换成0得到结果flag{hell0_w0rld}
re3:reverse21.下载附件并查壳64位,无壳
2.用ida64打开并查看字符找到关键字符,跟进并查看伪c代码
这题和re2类型一样跟进flag得到hacking_for_fun}所以flag{hack1ng_fo1_fun}
re4:内涵的软件1.下载附件并查壳
32位,无壳2.用ida32打开,并查看字符
DBAPP{49d3c93df25caad81232130f3d2ebfad}这段字符类似flag改成题目要求的形式flag{49d3c93df25caad81232130f3d2ebfad}答案正确
re5:新年快乐1.下载附件并查壳发现upx壳2.脱壳3.用ida32打开,并查看字符
找到关键字符并跟进,查看伪 ...
攻防世界(maze)
maze前言: 这中带maze的一般就是迷宫类题目,所以在做的时候思路就是:1.找到迷宫的地图2.找到方向3.找到迷宫路线
下面开始看题:1.下载附件并查壳
elf文件,64位2.用ida64打开,并通过shift+f12找有用的字符串(迷宫地图很有可能就在这里)
这写*可能就是地图,先留意着3.在函数里找到中重要函数,f54.找到各个方向代表的字母这四个应该就是四个方向,找到各个字符所代表的方向(当打开时,是数字,选中数字按 r 就能显示出来)跟踪sub_400650,sub_400660,sub_400670,sub_400680四个函数发现,”O””o””.””0”分别对应左右上下起点为“ “,终点为”#“果然那段就是地图,
字符串长度为63,前面加一个空字符(起点),刚好为8x8,8*8的迷宫:
5.路线:右下右右下下左下下下右右右右上上左左对应:o0oo00O000oooo..OOflag:nctf{o0oo00O000oooo..OO}
总结:攻防世界到此就结束了,下面开始刷ctfshow的题
迷宫问题了解更多点这里
攻防世界(getit)
getit1.下载附件并查壳elf文件且是64位2.用ida64打开,找到main函数f5,开始分析
(/tmp是linux临时文件夹,运行完之后就被清理了。)
可以看到先判断v5是否大于s存储字符串的长度,然后通过运算,最后将得到的flag写入文件两种方法,1.动态调试思路:在flag文件未被删除前,查看他。1.我们向下追踪,追踪到for循环的位置,因为,flag是在这里存入文件的,所以,我们可以在内存中找到正要存储的字符串我们将鼠标指向strlen(),在下面可以看到汇编所在的地址,然后我们根据大概的地址去看汇编代码
可以看到这是调用strlen()函数的汇编指令
我们通过第一个图片,可以知道经过for()的判断条件后,还要进行一步fseek函数,所以,根据汇编代码,可以确定jnb loc_4008B5就是fseek()函数,那么,mov eax,[rbp+var_3C]肯定就是最后要得到的flag了2.下面就要去linux调试它了首先
1231.gdb -q 文件名 //让其在gdb里运行2.b *0x400832 //下断点3.r //运行
我这里用到了gdb的插件peda, ...
攻防世界(csaw2013reversing2)
csaw2013reversing21.下载附件并查壳32位,无壳2.用ida打开找到main函数 (字符串无可用信息)可以明显看到这是在提示用动态调试这个sub_401000应该是属于解密函数在看其他信息有这个int 3断点,和loc_4010B9输出窗口所以大致猜测思路就是取消断点,跳转至解密函数,再跳转至输出窗口。
拖入od 1.让程序跳转至解密函数
2.找到断点地址109A,并取消断点。
3.找到输出窗口地址,即10B9,在解密函数下面进行跳转。
得到flag
总结: 第二次动态调试,有好多地方都是借鉴了大佬的思路,目前对汇编语言没有进行学习,所以有些地方比较吃力,但好在最后都能理解每一步的由来。
攻防世界(no-strings-attached)
no-strings-attached1.下载附件并查壳32位且是elf文件2.用ida32位打开(1)找到main函数,并查看字符串无可用信息3.f5生成伪c代码
当跟进最后一个时发现重要信息如果s2和ws相等就—跟进成功。然而s2是dword_8048A90被decrypt加密之后的产物,法一: 分析decrypt这个函数思路:跟进decrypt然后分析它的运算逻辑,然后,自己写脚本,得到最后的flag提取这些s和dword_8048A90的数据(shift+e)这里引用一位大佬的话
(得到 s 和 a2(即dword_8048A90) ,经过计算(相减)就能得到 dest ,即为 s2 。目标程序是 32 位 Ubuntu ,所以 wchar_t 表示 \0 占 4 字节,后面 4 个是截止符,不代入计算)
脚本如下:
12345678910111213141516171819202122232425262728293031323334#include <stdio.h>int main() {unsigned char s[] = {58, 2 ...
攻防世界(insanity~re1)
insanity1.下载附件并查壳可以看到是32位2.用ida32打开3.查看字符9447{This_is_a_flag}
python-trade1.下载附件发现是pyc文件2.用python反编译打开这个文件分析一下这个代码脚本如下:
1234567import base64c = 'XlNkVmtUI1MgXWBZXCFeKY+AaXNt'c = base64.b64decode(c)flag = ''for i in c: flag += chr((ord(chr(i))-16)^32)print(flag)
这里要先把 i 转换为字符再转换为ASCII码nctf{d3c0mpil1n9_PyC}
re11.下载并查壳32位2.用ida32打开法一:hex查看DUTCTF{We1c0met0DUTCTF}
法二:f5
可以看到一个关键的字符串,print(aFlag),那么证明这就是输入正确flag,然后,会输出aFlag证明你的flag正确,然后,继续往上分析,可以看到v3的值,是由strcmp()决定的,比较v5和输入的字符串,如果一 ...
攻防世界(logmein)
re41.下载附件并查壳可以看到是64位,用ida64打开2.查看字符可以看到下面的英语应该就是主要函数了,跟进它f5有一点是ida出现错误了等下说,(试了好多次发现的)分析之后是异或,脚本如下
123456v8= ':\"AL_RT^L*.?+6/46'v7='harambe'flag=''for i in range(len(v8)): flag+=chr(ord(v7[i%7])^ord(v8[i]))print(flag)
运行之后是 RC3-2016-XORISGUDflag+=chr(ord(v7[i%7])^ord(v8[i])) #而非v7+i%7,这是尝试了几次后发现的。
具体分析如下:这里细说一下v7,v7=28537194573619560,这里应该是字符,所以要把它转换,先转换为16进制,再hex转换为字符,是ebmarah,反序之后是这样harambe。
攻防世界(re2~re3)
open-source1.下载附件发现是用记事本打开这应该就是源码,分析得出2.的脚本如下
123for i in range(100): if((i%5!=3) and (i%17 ==8)): print(i)
1print(hex(51966*31337+(25%17)*11+7-1615810207))
得出 0xc0ffeeflag为 c0ffee
simple-unpack1.先下载附件查壳upx壳,2.在kali下脱壳(upx -d +文件名)3.脱壳后用ida64打开flag很明显了flag{Upx_1s_n0t_a_d3liv3r_c0mp4ny}