最近社团弄了CTF比赛,然后我就帮忙写了逆向的题目,这里写一下WriteUp,题目和源码在附件中给出

一个简单的逆向:one_jmp_to_flag.exe

这题算是签到题,直接OD智能搜索就完事了,flag{Welcome_to_GeekFZCTF}

一个简单的对比:check.exe

这一道也算是送分题,可以用IDA直接分析可以看出来,这里就是读取输入的字符串,然后逐个进行对比,这里可以直接用IDA转化为char型就可以看出。flag{sAdf_fDfkl_Fdf}

猜猜那个是flag:whichisflag.exe

首先加载进IDA,先看一下基本逻辑,输入的flag首先要小于25,然后进行判断进行判断,如果flag[5]=Y,且flag[8] = flag[11],flag[16] = flag[18],上面的都实现了就执行which_is_flag这个函数,我们跟进去看一下。

可以看到这是通过flag[5]进行switch跳转,然后我们之前有个判断条件flag[5]=Y,所以这里的跳转就是到89处

但是我们可以看到,这个flag的长度是大于25的,然后仔细观察一下flag里的内容,可以看出是base64编码过的,我们找个网站进行解码就可以,这里的flag是用python随机出来的,代码也在附件里。flag{YkEj_djkf3_jEj_eUn}

 简单的反调试:fts.exe

其实这道题目就只是用OD调试时会遇到一点反调试,如果用IDA直接分析逻辑就可以了,这里首先用IDA分析先。

可以看到一个可疑的循环并printf出来字符 ,我们看到逻辑就是用flag_2这个数组的数据与0x11进行异或,我们手动计算一下得出字符串(这里注意的是0x76707D77是小端序,我们要从77开始异或):flag{

然后我们可以继续往下面找关键循环,函数CheckDebug、fts_Rdtsc、the_end里都有循环输出,然后都解密出来就是:congratulations_for_you}

所以flag就是:flag{congratulations_for_you}

然后用OD动态调试一下,一开始就是先进行进程的检索,判断是否存在IDA或者OD,然后我们可以通过je直接跳过进行判断的地方。

跳过第一个反调试的地方后就得看一下我们的main函数入口在哪里(为什么不先找main函数,因为你不跳过第一个反调试即使找到main函数入口也没用,尝试一下就发现跳过了第一个反调试就很容易去到main函数了),我们这里先智能搜索一下可以看到一些字符串,你可以每个都进去看一下,然后发现main函数就在走过八十一难哪里(用IDA可以直接找到)

找到main函数后下断点,然后F9跳过去就可以单步跟踪了,我们可以发现会自己打印出了第一个解密循环

下面继续跟会发现有用到FindWindow函数去查找有没有IDA和OD,然后我们只要不让下面两个je进行跳转就可以,就会再打印出一段flag出来

跟进去函数里面,可以发现用了ZwQueryInformationProcess进行检测调试端口的,我们不让它跳转就会打印出字符串来

再进入下一个函数中,在里面可以看到rdtsc命令,这个用于把时间保存的指令,这里是基于时间的反调试,我们可以直接在下面的popad下断点然后F9直接跳过,然后就找到了解密循环。

最后进入函数,我们可以看到有一个get函数并且下面的跳转是关键,可以先随机输入一些东西,然后可以看到下面的跳转跳过了我们的printf函数,所以我们让它不跳转,然后就跑出最后的flag出来。

 简单的算法:suafa.exe

这是一个算法,然后这里要道个歉是出题不够严谨,在跑flag的时候会出现多解的情况。正向的核心算法是输入的字符串减去key之后对4求余,然后在key1到key4之间选择字符,最后与我们给定的字符进行对比

  1. char key1[] = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/";
  2. char key2[] = "+/abcdefghijklmnopqrstuvwxyz0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ";
  3. char key3[] = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789+/";
  4. char key4[] = "0123456789+/ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz";
  5.  
  6. char key[] = "QASWZXDECVFRBNGTHYJUMKIOLP";
  7. int len = strlen(flag);
  8. for(int i=; i<len; i++)
  9. {
  10. if(int(flag[i]) <= && int(flag[i]) >= )
  11. {
  12. if(flag[i]-key[i] > )
  13. {
  14. int the_key = (flag[i]-key[i]) % ;
  15. switch (the_key)
  16. {
  17. case :
  18. flag[i] = key1[flag[i]-key[i]];
  19. continue;
  20. case :
  21. flag[i] = key2[flag[i]-key[i]];
  22. continue;
  23. case :
  24. flag[i] = key3[flag[i]-key[i]];
  25. continue;
  26. case :
  27. flag[i] = key4[flag[i]-key[i]];
  28. continue;
  29. default:
  30. continue;
  31. }
  32. }
  33. else
  34. {
  35. printf("flag is wrong");
  36. ExitProcess();
  37. }
  38. }
  39. }

然后在逆向的时候我们用IDA打开基本都能编译出来,然后有一点小问题就是v5 = v4 - v1[key-flag]这里,反编译后与原来的代码int the_key = (flag[i]-key[i])有点差别,不过如果看汇编的代码可以更好的理解

其中sub eax, flag就是我们的v4 - v1[key-flag],而v4=flag[i],所以理论上flag = v1[key-flag],而我们汇编中flag的值为byte ptr [ebx+edx],这里的ebx可以从前面查看就是key,而edx就相当于索引。不懂得可以自己仔细看一下。

然后分析完就可以写个脚本自己跑出来:flag{this_is_a_easy_suanfa}

  1. #include "stdio.h"
  2. #include "Windows.h"
  3.  
  4. int main()
  5. {
  6. char key1[] = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/";
  7. char key2[] = "+/abcdefghijklmnopqrstuvwxyz0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ";
  8. char key3[] = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789+/";
  9. char key4[] = "0123456789+/ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz";
  10.  
  11. char key[] = "QASWZXDECVFRBNGTHYJUMKIOLP";
  12.  
  13. char flag_1[] = "tfoQ5ckkwhX51HYpxAjkMQYTAp5";
  14.  
  15. int yushu = ;
  16.  
  17. for(int m=; m<=; m++)
  18. {
  19. for(int n=; n<=; n++)
  20. {
  21. yushu = n - int(key[m]);
  22. yushu %= ;
  23. switch (yushu)
  24. {
  25. case :
  26. if(key1[n - int(key[m])] == flag_1[m])
  27. {
  28. printf("%c", n);
  29. }
  30. continue;
  31. case :
  32. if(key2[n - int(key[m])] == flag_1[m])
  33. {
  34. printf("%c", n);
  35. }
  36. continue;
  37. case :
  38. if(key3[n - int(key[m])] == flag_1[m])
  39. {
  40. printf("%c", n);
  41. }
  42. continue;
  43. case :
  44. if(key4[n - int(key[m])] == flag_1[m])
  45. {
  46. printf("%c", n);
  47. }
  48. continue;
  49. default:
  50. continue;
  51. }
  52. }
  53. printf("\n");
  54. }
  55. }

因为存在多解,所以跑出来得结果是这样子的

附件:题目、题目源码和脚本:https://github.com/QKSword/CTF-GeekFZ

社团的CTF逆向题WriteUp的更多相关文章

  1. z3 巧解CTF逆向题

    z3 巧解逆向题 题目下载链接:http://reversing.kr/download.php?n=7 这次实验的题目为Reversing.kr网站中的一道题目. 题目要求: ReversingKr ...

  2. bugku ctf 逆向题

    1.逆向入门 2.Easy_vb 直接找出来. 3.easy_re 4.游戏过关 摁着嗯着就出来了... 5.Timer{阿里ctf} apk文件,不会搞. 6.逆向入门 发现是base64,直接转图 ...

  3. 南京邮电大学 CTF 逆向部分 Writeup

    Hello,RE! 提示 IDA 中按 R . Google 到 IDA 中 R 快捷键是 Character ,转为字符串. 丢进 IDA(虽然我并不会使用 IDA 有个 strcmp 函数,比较 ...

  4. 4.ctf实战题

    一道ctf实战题. 先亮出网址: http://fb2ad00f-0a28-4e38-8fff-849d7391e2d0.coding.io 打开连接,看到下面页面.Web题,首先就是扫描(御剑啊还有 ...

  5. 第二届强网杯部分题writeup

    0x00 题目名称 签到 操作内容:   FLAG值: flag{welcome_to_qwb} 0x01 题目名称 Weclome 操作内容: 通过查看文件发现是一个bmp格式的图片文件,然后加上后 ...

  6. DDCTF2019逆向分析前俩题WriteUP

    DDCTF2019 笔者做了前俩道题.冷不丁过去一个月了.现在在此做一下WriteUp:题目链接: 1:题目1 2:题目2 reverse1:writeup: 1.程序打开后如下所示 2.查壳结果为U ...

  7. 百道CTF刷题记录(一)

    简介 最近在刷CTF题,主攻Web,兼职Misc Shiyanbar 0x01 简单的登陆题 简单概括: 考点: %00截断正则 CBC字节翻转攻击 难度: 难 WP:https://blog.csd ...

  8. 某CTF代码审计题

    记一次参加CTF比赛翻车记!   开始还是挺有信心的,毕竟也是经常打一些CTF锻炼,然而比赛发现大佬们平时不显山不漏水的一比赛全出来了!赛后看了一下各题的writeup发现自己的确技不如人啊!借鉴一个 ...

  9. 31C3 CTF web关writeup

    0x00 背景 31c3 CTF 还是很人性化的,比赛结束了之后还可以玩.看题解做出了当时不会做的题目,写了一个writeup. 英文的题解可以看这:https://github.com/ctfs/w ...

随机推荐

  1. JaVa第二周学习总结

    第一周学习的时候上传图片用的是网站外链然后导致出现了极为尴尬的情形...然后我就把第一周的全改成本地上传了. 首先列出所做任务 1 安装IDEA 2学习二三章视频,课本 3调试代码,上传码云 4总结问 ...

  2. UE导航系统详

    配置 Navigation Crowd Manager Class 代理人管理类 可以自定义个 Navigation System Auto Create Navigation Data 导航数据在没 ...

  3. Centos7 安装 python2.7

    Centos7 安装 python 2.7.15 和 pip  1.先安装 GCC 包,如果没安装 GCC包 就输入以下命令行安装: (*注:以下记得使用 su 权限) yum install gcc ...

  4. 2018-2019-1 20189208《Linux内核原理与分析》第八周作业

    学习笔记 1.ELF目标文件格式 编译器生成目标文件,目标文件与目标平台二进制兼容. ELF:可执行或可链接的格式,是目标文件格式标准. ELF类型: 可重定位文件:编译器汇编器创建的 .o 文件,最 ...

  5. java学习笔记01-环境配置

    需要先下载java的jdk,jdk是java的开发工具包,jre是java的运行环境,jdk里面都会带有jre的. 打开www.java.com,点击免费下载就行.之后默认安装就行了 1.设置JAVA ...

  6. 游记-WC2019

    Day0 报道.开幕式 一大早起来吃了个老北京炸酱面,然而一点都不北京,发现店子墙壁上"这9是--"(cy语) 一路辗转到了二中,报到时在签字版爷稳稳名字下写了cgz ak ioi ...

  7. css3之border-radius理解

    在日常项目过程中,border-radius这个属性算是非常常用的属性之一了,通过设置元素的border-radius值,可以轻松给元素设置圆角边框,甚至实现绘制圆.半圆.四分之一的圆等各种圆角图形. ...

  8. 帆软报表(finereport)安装/配置

    1.首先是安装帆软报表软件 下载地址:http://www.finereport.com/product/download           激活码注册格账号就有了 2.启动软件,新建连接数据库 点 ...

  9. 【原创】大数据基础之Zookeeper(4)应用场景

    1 集群配置管理 应用服务器的配置通常会放到properties文件中,格式为: system1.module2.prop3=value4 然后启动的时候加载,这样带来的问题是启动后无法修改,想修改必 ...

  10. 【原创】大叔经验分享(24)hive metastore的几种部署方式

    hive及其他组件(比如spark.impala等)都会依赖hive metastore,依赖的配置文件位于hive-site.xml hive metastore重要配置 hive.metastor ...