REVERSE-PRACTICE-BUUCTF-27

  • [XMAN2018排位赛]Dragon Quest
  • [羊城杯 2020]easyre
  • [watevrCTF 2019]Repyc
  • [2019红帽杯]calc

[XMAN2018排位赛]Dragon Quest

elf文件,无壳,ida分析
main函数,读取输入,start_quest函数验证输入,根据返回值判断输入是否正确

进入start_quest函数,首先是给hero数组添加元素,检验输入的长度是否为28,输入长度等于28则v7为0,否则v7为1

往下走,由于需要start_quest返回0x1337,则需v7为0,即输入的长度等于28
sanitize_input函数对输入进行检验,由变量值传递可知,sanitize_input函数也要返回0x1337

进入sanitize_input函数,主要的逻辑为,输入进入transform_input函数处理,返回值与hero数组比较

    v31 = (char *)std::string::operator[](input, index);// 从input中取一个字节if ( y18 >= 10 && (((_BYTE)x17 - 1) * (_BYTE)x17 & 1) != 0 ){LABEL_71:if ( y4 >= 10 && (((_BYTE)x3 - 1) * (_BYTE)x3 & 1) != 0 )goto LABEL_114;while ( 1 ){*(_DWORD *)v40 = *v31;if ( y4 < 10 || (((_BYTE)x3 - 1) * (_BYTE)x3 & 1) == 0 )break;
LABEL_114:*(_DWORD *)v40 = *v31;}}*(_DWORD *)v40 = *v31;                      // v31->v40if ( y18 >= 10 && (((_BYTE)x17 - 1) * (_BYTE)x17 & 1) != 0 )goto LABEL_71;while ( y4 >= 10 && (((_BYTE)x3 - 1) * (_BYTE)x3 & 1) != 0 );std::vector<int,std::allocator<int>>::push_back(v42, v40);// v40被添加到v42数组dov30 = y18 < 10 || (((_BYTE)x17 - 1) * (_BYTE)x17 & 1) == 0;while ( y4 >= 10 && (((_BYTE)x3 - 1) * (_BYTE)x3 & 1) != 0 );if ( !v30 )
LABEL_74:*v37 = *v41;if ( y4 >= 10 && (((_BYTE)x3 - 1) * (_BYTE)x3 & 1) != 0 )
LABEL_99:*v37 = *v41;v1 = v37;*v37 = *v41;v29 = *v1;v28 = y18 < 10 || (((_BYTE)x17 - 1) * (_BYTE)x17 & 1) == 0;if ( y4 >= 10 && (((_BYTE)x3 - 1) * (_BYTE)x3 & 1) != 0 )goto LABEL_99;if ( !v28 )goto LABEL_74;v27 = std::string::length(input);dov26 = y18 < 10 || (((_BYTE)x17 - 1) * (_BYTE)x17 & 1) == 0;while ( y4 >= 10 && (((_BYTE)x3 - 1) * (_BYTE)x3 & 1) != 0 );if ( !v26 )
LABEL_75:*v37 = (v27 >> 40) & v29 | 0x1C;v2 = v37;*v37 = (v27 >> 40) & v29 | 0x1C;v25 = *v2 != 0;if ( y18 >= 10 && (((_BYTE)x17 - 1) * (_BYTE)x17 & 1) != 0 )goto LABEL_75;while ( y4 >= 10 && (((_BYTE)x3 - 1) * (_BYTE)x3 & 1) != 0 );if ( v25 ){doindex_ = *v41;while ( y18 >= 10 && (((_BYTE)x17 - 1) * (_BYTE)x17 & 1) != 0 );v23 = (int *)std::vector<int,std::allocator<int>>::operator[]((unsigned int)&hero, index_);// 从hero中取一个字节dov22 = y18 < 10 || (((_BYTE)x17 - 1) * (_BYTE)x17 & 1) == 0;while ( y4 >= 10 && (((_BYTE)x3 - 1) * (_BYTE)x3 & 1) != 0 );dov21 = *v23;                             // v23->v21while ( y18 >= 10 && (((_BYTE)x17 - 1) * (_BYTE)x17 & 1) != 0 );std::vector<int,std::allocator<int>>::vector(v36, v42);// v42赋给v36dov20 = y18 < 10 || (((_BYTE)x17 - 1) * (_BYTE)x17 & 1) == 0;while ( y4 >= 10 && (((_BYTE)x3 - 1) * (_BYTE)x3 & 1) != 0 );while ( y18 >= 10 && (((_BYTE)x17 - 1) * (_BYTE)x17 & 1) != 0 );while ( y4 >= 10 && (((_BYTE)x3 - 1) * (_BYTE)x3 & 1) != 0 );v19 = transform_input(v36);               // 对v36处理,返回到v19if ( y18 >= 10 && (((_BYTE)x17 - 1) * (_BYTE)x17 & 1) != 0 )goto LABEL_79;while ( 1 ){v18 = v21 == v19;                       // v19与v21比较

进入transform_input函数,主要的逻辑为,取出输入的一个字节input[i],v16初始值为0,v16每次加上input[i],然后返回v16,与hero数组的元素比较

已知hero数组,写逆运算脚本即可得到flag

hero=[0x64,0xd6,0xa,0x71,0xa1,0xf,0x6e,0xdd,0x4f,0xae,0x1e,0x52,0xc6,0x38,0xa1,0x4,0x35,0x96,0x4,0x63,0xcc,0x40,0x75,0xd4,0x20,0x6c,0xc2,0xf]
n=0
flag=""
for i in range(len(hero)):tmp=hero[i]-nn+=tmpflag+=chr(tmp%128)
print(flag)
#dr4g0n_or_p4tric1an_it5_LLVM

[羊城杯 2020]easyre

exe程序,运行后输入,无壳,ida分析
main函数,读取输入,检验输入的长度是否为38,对输入进行三次变换,最后与Str2比较

三次变换都很容易理解,分别是常规base64,分组换位置,以及类似凯撒的右移三位
写逆运算脚本即可得到flag

import base64
str2="EmBmP5Pmn7QcPU4gLYKv5QcMmB3PWHcP5YkPq3=cT6QckkPckoRG"
data=[]
for c in str2:if c.isdigit():data.append((ord(c)-48-3)%10+48)elif c.isupper():data.append((ord(c)-65 - 3) % 26 + 65)elif c.islower():data.append((ord(c)-97 - 3) % 26 + 97)else:data.append(ord(c))
flag=[0]*len(data)
flag[0:13]=data[13:26]
flag[13:26]=data[39:len(data)]
flag[26:39]=data[0:13]
flag[39:len(flag)]=data[26:39]
print(base64.b64decode(''.join(chr(i) for i in flag)))
# GWHT{672cc4778a38e80cb362987341133ea2}

[watevrCTF 2019]Repyc

.pyc文件,用uncompyle6反编译得到源代码,python2会检测为非ascii码,换成python3即可

佤 = 0
侰 = ~佤 * ~佤
俴 = 侰 + 侰def 䯂(䵦):굴 = 佤굿 = 佤괠 = [佤] * 俴 ** (俴 * 俴)궓 = [佤] * 100괣 = []while 䵦[굴][佤] != '듃':굸 = 䵦[굴][佤].lower()亀 = 䵦[굴][侰:]if 굸 == '뉃':괠[亀[佤]] = 괠[亀[侰]] + 괠[亀[俴]]else:if 굸 == '렀':괠[亀[佤]] = 괠[亀[侰]] ^ 괠[亀[俴]]else:if 굸 == '렳':괠[亀[佤]] = 괠[亀[侰]] - 괠[亀[俴]]else:if 굸 == '냃':괠[亀[佤]] = 괠[亀[侰]] * 괠[亀[俴]]else:if 굸 == '뢯':괠[亀[佤]] = 괠[亀[侰]] / 괠[亀[俴]]else:if 굸 == '륇':괠[亀[佤]] = 괠[亀[侰]] & 괠[亀[俴]]else:if 굸 == '맳':괠[亀[佤]] = 괠[亀[侰]] | 괠[亀[俴]]else:if 굸 == '괡':괠[亀[佤]] = 괠[亀[佤]]else:if 굸 == '뫇':괠[亀[佤]] = 괠[亀[侰]]else:if 굸 == '꼖':괠[亀[佤]] = 亀[侰]else:if 굸 == '뫻':궓[亀[佤]] = 괠[亀[侰]]else:if 굸 == '딓':괠[亀[佤]] = 궓[亀[侰]]else:if 굸 == '댒':괠[亀[佤]] = 佤else:if 굸 == '묇':궓[亀[佤]] = 佤else:if 굸 == '묟':괠[亀[佤]] = input(괠[亀[侰]])else:if 굸 == '꽺':궓[亀[佤]] = input(괠[亀[侰]])else:if 굸 == '돯':print(괠[亀[佤]])else:if 굸 == '뭗':print(궓[亀[佤]])else:if 굸 == '뭿':굴 = 괠[亀[佤]]else:if 굸 == '뮓':굴 = 궓[亀[佤]]else:if 굸 == '뮳':굴 = 괣.pop()else:if 굸 == '믃':if 괠[亀[侰]] > 괠[亀[俴]]:굴 = 亀[佤]괣.append(굴)continueelse:if 굸 == '꽲':괠[7] = 佤for i in range(len( 괠[亀[佤]])):if 괠[亀[佤]] != 괠[亀[侰]]:괠[7] = 侰굴 = 괠[亀[ 俴]]괣.append(굴)else:if 굸 == '꾮':괢 = ''for i in range(len(괠[亀[佤]])):괢 += chr(ord(괠[亀[佤]][i]) ^ 괠[亀[侰]])괠[亀[佤]] = 괢else:if 굸 == '꿚':괢 = ''for i in range(len(괠[亀[佤]])):괢 += chr(ord(괠[亀[佤]][i]) - 괠[亀[侰]])괠[亀[佤]] = 괢else:if 굸 == '떇':if 괠[亀[侰]] > 괠[亀[俴]]:굴 = 괠[亀[佤]]괣.append(굴)continueelse:if 굸 == '뗋':if  괠[亀[侰]] > 괠[亀[俴]]:굴 = 궓[亀[佤]]괣.append(굴)continueelse:if  굸 == '똷':if 괠[亀[侰]] == 괠[亀[俴]]:굴 = 亀[佤]괣.append(굴)continueelse:if 굸 == '뚫':if 괠[亀[侰]] == 괠[亀[俴]]:굴 = 괠[亀[佤]]괣.append(굴)continueelse:if 굸 == '띇':if 괠[亀[侰]] == 괠[亀[俴]]:굴 = 궓[亀[佤]]괣.append(굴)continue굴 += 侰䯂([['꼖', 佤, 'Authentication token: '],['꽺', 佤, 佤],['꼖', 6, 'á×äÓâæíäàßåÉÛãåäÉÖÓÉäàÓÉÖÓåäÉÓÚÕæïèäßÙÚÉÛÓäàÙÔÉÓâæÉàÓÚÕÓÒÙæäàÉäàßåÉßåÉäàÓÉÚÓáÉ·Ôâ×ÚÕÓÔɳÚÕæïèäßÙÚÉÅä×ÚÔ ×æÔÉ×Úïá×ïåÉßÉÔÙÚäÉæÓ×ÜÜïÉà×âÓÉ×ÉÑÙÙÔÉâßÔÉÖãäÉßÉæÓ×ÜÜïÉÓÚÞÙïÉäàßåÉåÙÚÑÉßÉàÙèÓÉïÙãÉáßÜÜÉÓÚÞÙïÉßäÉ×åáÓÜÜ\x97ÉïÙãäãÖÓ\x9aÕÙÛ\x99á×äÕà©â«³£ï²ÕÔÈ·±â¨ë'],['꼖', 俴, 俴 ** (3 * 俴 + 侰) - 俴 ** (俴 + 侰)],['꼖', 4, 15],['꼖', 3, 侰],['냃', 俴, 俴, 3],['뉃', 俴, 俴, 4],['괡', 佤, 俴],['댒', 3],['꾮', 6, 3],['꼖', 佤, 'Thanks.'],['꼖', 侰, 'Authorizing access...'],['돯', 佤],['딓', 佤, 佤],['꾮', 佤, 俴],['꿚', 佤, 4],['꼖', 5, 19],['꽲', 佤, 6, 5],['돯', 侰],['듃'],['꼖', 侰, 'Access denied!'],['돯', 侰],['듃']])

运行后输入,调试发现,对输入的处理很简单,input[i]=((input[i])^135)-15,即输入先异或135,再减去15,最后和那段长字符串比较,写脚本即可得到flag

res="á×äÓâæíäàßåÉÛãåäÉÖÓÉäàÓÉÖÓåäÉÓÚÕæïèäßÙÚÉÛÓäàÙÔÉÓâæÉàÓÚÕÓÒÙæäàÉäàßåÉßåÉäàÓÉÚÓáÉ·Ôâ×ÚÕÓÔɳÚÕæïèäßÙÚÉÅä×ÚÔ ×æÔÉ×Úïá×ïåÉßÉÔÙÚäÉæÓ×ÜÜïÉà×âÓÉ×ÉÑÙÙÔÉâßÔÉÖãäÉßÉæÓ×ÜÜïÉÓÚÞÙïÉäàßåÉåÙÚÑÉßÉàÙèÓÉïÙãÉáßÜÜÉÓÚÞÙïÉßäÉ×åáÓÜÜ\x97ÉïÙãäãÖÓ\x9aÕÙÛ\x99á×äÕà©â«³£ï²ÕÔÈ·±â¨ë"
flag=""
for c in res:flag+=chr((ord(c)+15)^135)
print(flag)
#watevr{this_must_be_the_best_encryption_method_evr_henceforth_this_is_the_new_Advanced_Encryption_Stand¨ard_anyways_i_dont_really_have_a_good_vid_but_i_really_enjoy_this_song_i_hope_you_will_enjoy_it_aswell!_youtube.com/watch?v=E5yFcdPAGv0}

[2019红帽杯]calc

exe程序,运行后输入,无壳,ida分析
三次输入,对输入一顿运算,没看懂
参考网上别的师傅的wp,2019红帽杯 Writeup by X1cT34m
原来是在满足input_2<input_1<input_3的条件下,得到input_1**3+input_2**3+input_2**3==42,即三个整数的立方和等于42
百度一下,果然有解

(-80538738812075974)**3 + 80435758145817515**3 + 12602123297335631**3==42


将程序的三个sleep函数patch掉,按input_2<input_1<input_3的条件输入,得到flag

import hashlib
flag="flag{"
s="804357581458175151260212329733563180538738812075974"
h=hashlib.md5()
h.update(s.encode(encoding='utf-8'))
flag+=h.hexdigest()
flag+="}"
print(flag)
# flag{951e27be2b2f10b7fa22a6dc8f4682bd}

REVERSE-PRACTICE-BUUCTF-27相关推荐

  1. 金海佳学C++primer 练习9.27

    查找并删除forward_list中的奇数元素 Practice 9.27 #include <iostream> #include <string> #include < ...

  2. C\C++代码优化的27个建议

    本文由  伯乐在线  -  周昌鸿  翻译自  cs.clemson.edu .欢迎加入 技术翻译小组 .转载请参见文章末尾处的要求. 1. 记住阿姆达尔定律: funccost是函数func运行时间 ...

  3. 基于HTML5实现3D热图Heatmap应用

    Heatmap热图通过众多数据点信息,汇聚成直观可视化颜色效果,热图已广泛被应用于气象预报.医疗成像.机房温度监控等行业,甚至应用于竞技体育领域的数据分析. http://www.hightopo.c ...

  4. 【NYOJ-35】表达式求值——简单栈练习

    表达式求值 时间限制:3000 ms  |  内存限制:65535 KB 难度:3 描述 Dr.Kong设计的机器人卡多掌握了加减法运算以后,最近又学会了一些简单的函数求值,比如,它知道函数min(2 ...

  5. 编程必备:c/c++的编程经验技巧!

    1. 记住阿姆达尔定律: funccost是函数func运行时间百分比,funcspeedup是你优化函数的运行的系数. 所以,如果你优化了函数TriangleIntersect执行40%的运行时间, ...

  6. abovedisplayskip无效_初学latex的模板,里面有错,哪位大神能不能帮忙看看啊?不甚感激!...

    \documentclass[twoside,CJK]{cctart} \usepackage{headrule,vatola,amssymb} \usepackage{graphicx,multir ...

  7. 【GIS开发】地理编码服务Geocoder(Python)

    文章目录 1.简介 2.百度 3.高德 4.google map 5.nominatim 5.1 overview 5.2 web api 5.3 python api (geopy) 6.geoco ...

  8. C++黑马视频教程对应的课件

    C++黑马视频对应教程 文档一共分为三部分: part one c++基础入门 part two c++核心编程 part three c++提高编程 自己整理的,希望对大家学习c++有帮助 Visu ...

  9. 共享单车调度_共享单车调度模型及算法研究

    [1] 周进.互联网共享单车对出行方式选择及交通运行的影响[C]∥2017城市发展与规划论文集.海口:中国城市科学研究会,2017:412-418. ZHOU Jin. The impact of A ...

  10. BZOJ 3091 城市旅行 (LCT)

    3091: 城市旅行 Time Limit: 10 Sec  Memory Limit: 128 MB Submit: 2251  Solved: 761 [Submit][Status][Discu ...

最新文章

  1. CentOS 6.x使用yum快速安装MySQL 5.5
  2. 阿里云 mysql 无缘无故挂掉
  3. ASP.NET用户登录模块代码
  4. VALSE2019总结(2)-以人为中心的视觉理解
  5. html元素data属性设置变量,HTML5 自定义属性 data-* 和 jQuery.data 详解
  6. python中将整数转化为八进制的函数,Python进制转化
  7. Golang实践录:获取系统信息
  8. Cisco交换机上的链路聚合
  9. 为什么感觉赚100万很难?
  10. net如何在aspx页面中将html页面快速的加入runat,asp.net中在aspx.cs向aspx页面写代码有哪几种方法?...
  11. 学生选课系统简单说明
  12. ISO26262功能安全--产品开发过程
  13. ARCMAP点集转线工具提示999999错误
  14. 如何组装配置属于自己的台式机
  15. MySQL中的BETWEEN...AND的用法
  16. 计算机基础与程序设计自考怎么过
  17. zcmu Problem E: 喜闻乐见的a+b
  18. 最新(U盘木马)Auto病毒专杀
  19. coteditor mac版文本编辑器
  20. 飞思卡尔杯全国大学生智能车竞赛回忆录(双车追逐组)

热门文章

  1. ShardedJedisPool 中可用连接数的小bug
  2. ios sqlite3 初级应用
  3. [Leedcode][JAVA][第200题][岛屿数量][DFS][BFS][并查集]
  4. jmap 文件解析_干货分享丨jvm系列:dump文件深度分析
  5. access是不是计算机编程,access编程简介之二:用宏还是VBA?
  6. python中superclass是什么_深度解析并实现python中的super(转载,好文)
  7. json java typeof_Json对象与Json字符串的转化、JSON字符串与Java对象的转换
  8. twrp3.3.0刷n9002_插画师必备笔刷,送你5套iPad5.0新出300款大神笔刷
  9. 801. 二进制中1的个数
  10. linux 磁盘科隆,上海第二工业大学嵌入式操作系统B复习(无答案版)