REVERSE-PRACTICE-BUUCTF-32

REVERSE-PRACTICE-BUUCTF-32

    • [第四章 CTF之APK章]数字壳的传说
    • [第五章 CTF之RE章]Hello, RE
    • [第五章 CTF之RE章]BabyAlgorithm
    • [第五章 CTF之RE章]BabyConst
    • [第五章 CTF之RE章]BabyLib
    • [第五章 CTF之RE章]easy_rust
    • [第五章 CTF之RE章]easy_go
    • [第五章 CTF之RE章]easy_mfc

[第四章 CTF之APK章]数字壳的传说

查壳,360加固
apk-shell
用frida脚本脱壳后,jadx-gui分析得到的dex文件
输入作为明文,输入的前6个字符作为密钥,字符串"123456"作为iv
对输入进行AES.CBC加密,得到的密文经base64编码后与已知的base64字符串比较
apk-main
分析AESUtils这个类
第19行把密钥扩展成长度为32的字符串,不足的补空格" "
第37行把iv扩展成长度为16的字符串,不足的补空格" "
apk-aes
密钥为输入的前6个字符,猜测是"N1BOOK"或者"n1book"
python解AES.CBC,当密钥为"n1book"时,解出flag

from Crypto.Cipher import AES
import base64
cipher="u0uYYmh4yRpPIT/zSP7EL/MOCliVoVLt3gHcrXDymLc="
cipher_str=base64.b64decode(cipher)
key_str="n1book"
key_str=key_str.ljust(32," ")
iv_str="123456"
iv_str=iv_str.ljust(16," ")
aes=AES.new(key_str,AES.MODE_CBC,iv_str)
print(aes.decrypt(cipher_str))
#n1book{h3ckF0rfun}

[第五章 CTF之RE章]Hello, RE

exe程序,ida打开后,在main函数中找到flag
re-flag

[第五章 CTF之RE章]BabyAlgorithm

elf文件,ida打开
main函数中,读取输入,验证输入长度是否为45,然后设置密钥,对输入进行RC4加密,得到的密文与已知的v8比较
re-main
已知密钥为"Nu1Lctf233",密文为v8,解RC4即可得到flag

#include<stdio.h>
void rc4_init(unsigned char* s, unsigned char* key, unsigned long Len_k)
{int i = 0, j = 0;char k[256] = { 0 };unsigned char tmp = 0;for (i = 0; i < 256; i++) {s[i] = i;k[i] = key[i % Len_k];}for (i = 0; i < 256; i++) {j = (j + s[i] + k[i]) % 256;tmp = s[i];s[i] = s[j];s[j] = tmp;}
}/*
RC4加解密函数
unsigned char* Data     加解密的数据
unsigned long Len_D     加解密数据的长度
unsigned char* key      密钥
unsigned long Len_k     密钥长度
*/
void rc4_crypt(unsigned char* Data, unsigned long Len_D, unsigned char* key, unsigned long Len_k) //加解密
{unsigned char s[256];rc4_init(s, key, Len_k);int i = 0, j = 0, t = 0;unsigned long k = 0;unsigned char tmp;for (k = 0; k < Len_D; k++) {i = (i + 1) % 256;j = (j + s[i]) % 256;tmp = s[i];s[i] = s[j];s[j] = tmp;t = (s[i] + s[j]) % 256;Data[k] = Data[k] ^ s[t];}
}
void main()
{//密钥unsigned char key[] = "Nu1Lctf233";unsigned long key_len = sizeof(key) - 1;//密钥//unsigned char key[] = {};//unsigned long key_len = sizeof(key);//密文unsigned char data[] = { 0xC6, 0x21, 0xCA, 0xBF, 0x51, 0x43, 0x37, 0x31, 0x75, 0xE4,0x8E, 0xC0, 0x54, 0x6F, 0x8F, 0xEE, 0xF8, 0x5A, 0xA2, 0xC1,0xEB, 0xA5, 0x34, 0x6D, 0x71, 0x55, 0x08, 0x07, 0xB2, 0xA8,0x2F, 0xF4, 0x51, 0x8E, 0x0C, 0xCC, 0x33, 0x53, 0x31, 0x00,0x40, 0xD6, 0xCA, 0xEC, 0xD4 };//解密rc4_crypt(data, sizeof(data), key, key_len);for (int i = 0; i < sizeof(data); i++){printf("%c", data[i]);}printf("\n");return;
}
//n1book{us1nG_f3atur3s_7o_de7erm1n3_4lg0ri7hm}

[第五章 CTF之RE章]BabyConst

elf文件,ida打开
main函数中,输入的长度为48,每四个一组,共12组,经过变换后与已知比较
可以看到每组的四个字符经变换后变成了一组包含16字节的数据,即16*8==128bit的数据
re-main
往下看sub_40085B函数,a1[2]~a1[5]分别设置成0x67452301,0xEFCDAB89,0x98BADCFE,0x10325476
于是可以猜到是md5算法,这四个值是标准的幻数
参考:MD5算法原理及其实现
re-sub40085b
最后在md5这个网站解md5,每组解完拼接起来就是flag

arr=[0x39, 0x6D, 0xF0, 0xD2, 0x42, 0x41, 0xF8, 0x02, 0x16, 0x7A,0xDC, 0xC0, 0xD6, 0x10, 0x6E, 0xD3, 0xFE, 0x68, 0x6F, 0x27,0xE9, 0x00, 0x81, 0x6B, 0xB2, 0xB8, 0xBC, 0x63, 0xD7, 0x0D,0x40, 0x08, 0xD2, 0xCD, 0xB7, 0x10, 0x60, 0x4D, 0x69, 0x64,0xA8, 0x36, 0x25, 0x54, 0xF7, 0xDE, 0xF0, 0x96, 0xDF, 0xC4,0xF8, 0x47, 0xAC, 0xDE, 0x92, 0xAC, 0x23, 0xC4, 0x69, 0x4B,0xEF, 0x32, 0x50, 0x28, 0x46, 0x82, 0xA2, 0x4D, 0x59, 0xA9,0x8E, 0x7A, 0x66, 0xD8, 0xE0, 0xD3, 0x1F, 0xD9, 0xBD, 0x68,0x46, 0x04, 0xF6, 0x12, 0xD8, 0xA7, 0x1D, 0xEB, 0x0D, 0xFA,0x03, 0x5E, 0x3F, 0x06, 0xA5, 0x9B, 0x99, 0xAA, 0x58, 0x66,0x28, 0xD9, 0x70, 0x72, 0x73, 0x28, 0x6B, 0x4C, 0x87, 0x32,0xDC, 0xFF, 0xA6, 0xC9, 0xFE, 0x07, 0x74, 0x20, 0xE1, 0xDE,0xFD, 0xD7, 0xC8, 0x7B, 0x59, 0xCD, 0x1D, 0x73, 0xCB, 0x7F,0x25, 0x22, 0xCC, 0x3D, 0xF2, 0x0F, 0xF2, 0x98, 0x7E, 0x98,0x42, 0x7F, 0x05, 0xD2, 0xBE, 0x57, 0x03, 0xDD, 0x22, 0xDD,0xC3, 0x18, 0xEA, 0x07, 0x24, 0x80, 0x44, 0xD7, 0xEC, 0xCC,0xFF, 0xF5, 0x6B, 0xC4, 0x60, 0x70, 0xDA, 0xE9, 0xF9, 0x46,0x6C, 0x11, 0x76, 0x5D, 0x0C, 0x21, 0x0E, 0x49, 0x91, 0xA0,0x2A, 0x04, 0xE4, 0x21, 0x84, 0x9F, 0x2A, 0xB8, 0x9B, 0x7D,0x9E, 0xEA]
for i in range(0,len(arr),16):s=""for j in range(16):s+=hex(arr[i+j]).zfill(4).replace("0x","")print(s)
# 396df0d24241f802167adcc0d6106ed3 -->n1bo
# fe686f27e900816bb2b8bc63d70d4008 -->ok{U
# d2cdb710604d6964a8362554f7def096 -->5in9
# dfc4f847acde92ac23c4694bef325028 -->__c0
# 4682a24d59a98e7a66d8e0d31fd9bd68 -->n5ts
# 4604f612d8a71deb0dfa035e3f06a59b -->_7o_
# 99aa586628d9707273286b4c8732dcff -->1d3n
# a6c9fe077420e1defdd7c87b59cd1d73 -->t1fy
# cb7f2522cc3df20ff2987e98427f05d2 -->_mD5
# be5703dd22ddc318ea07248044d7eccc -->__41
# fff56bc46070dae9f9466c11765d0c21 -->gor1
# 0e4991a02a04e421849f2ab89b7d9eea -->thm}#n1book{U5in9__c0n5ts_7o_1d3nt1fy_mD5__41gor1thm}

[第五章 CTF之RE章]BabyLib

elf文件,ida打开
交叉引用字符串"Input flag:"来到主逻辑函数
可以看到存在非常大的整数,而且65537很令人在意
RSA的题目做多了就会有感觉,65537通常是作为逆向题目中RSA的指数e,其他的大整数就分别是p,q和c
re-main
解RSA即可得到flag

import gmpy2
from Crypto.Util.number import long_to_bytes
p=9842210544704105105386460208892325341518023212707647450607909247791133264519200579173177912467785842558060968492186761162106356089009194470097546296829163
q=12972360952153818155692381381571252126631475184728971905301445264084096070607651598626783223094292740492828654265391639843199875189333033337169565006624907
n=p*q
e=65537
c=110694010334901653238216140152683772418101197298114114481381418739511015861349388028360214495059500357527716613334520805339266807313669925649167175211788624655809951516502907329949137499677877779584898365309802983718066683849944838484002656376845311375573423677826690834875095904482448693671735053088583663382
phin=(p-1)*(q-1)
d=gmpy2.invert(e,phin)
m=gmpy2.powmod(c,d,n)
print(long_to_bytes(m))
# n1book{1d3nt1fy_GMp_l1br4ry}

[第五章 CTF之RE章]easy_rust

rust语言,调试
变表base64,在这个地方找到变表
re-table
然后main函数中的第46行的cmp的第二个参数指向的是密文字符串
re-main
密文字符串,实际上在上面找到变表的那个位置,在"Input your flag:\n"与"Failed to read lineTrue!\nFalse!\n"之间就是密文字符串
re-cipher
解变表base64,第一个等号"=“隔断了flag的两个部分,最后的”=MlW"没有用
re-flag
拼接起来,中间加个"_",最后加上"}",于是flag为n1book{9o0d_j0b}
re-success

[第五章 CTF之RE章]easy_go

go语言,调试
输入的包络为"n1book{}",输入的总长度为21
比较验证在第79行的if语句
逻辑为:byte_561538[i] + byte_561518[i] * input[i] == byte_561528[i]
re-main
每个参与运算的整型都是8bit,写脚本时要注意截断

arr_18=[0xD3, 0x75, 0x9B, 0xF9, 0xA3, 0x87, 0xED, 0x93, 0x8D, 0xDD,0x77, 0xED, 0x67, 0x00, 0x00, 0x00]
arr_28=[0xB7, 0x9C, 0x79, 0x43, 0x9B, 0xAF, 0x94, 0xE4, 0x94, 0x71,0xEC, 0xEA, 0x8E, 0x00, 0x00, 0x00]
arr_38=[0xDB, 0x9E, 0xB7, 0x9A, 0x91, 0xCA, 0xA1, 0x6B, 0x97, 0xC1,0x74, 0xB3, 0x90, 0x00, 0x00, 0x00]
flag=""
for i in range(13):for j in range(32,128):if arr_28[i]==(arr_38[i]+(arr_18[i]*j)&0xff)&0xff:flag+=chr(j)
print("n1book{"+flag+"}")
#n1book{4Ff1n3_C1pH3R}

[第五章 CTF之RE章]easy_mfc

mfc的exe,用xspy找到一个函数
“OnCommand: notifycode=0000 id=0001,func= 0x00C61880(easy_mfc.exe+ 0x001880 )”
re-mfc
ida打开,去找偏移为"0x1880"的函数,读取输入,然后验证
re-func
进入sub_401910函数,可以看到,输入与v7循环异或,结果与v5比较
re-main
写逆异或脚本即可得到flag

v7=[0xBC, 0x9D, 0x8C, 0x92,0x40, 0x47, 0x86, 0x21,0xF5, 0xAC, 0x8F, 0xFD,0x68, 0xE4, 0xE9, 0x3A, 0xC0, 0x66, 0xB3, 0x64,0x7E, 0x79, 0xD3, 0x22,0x31, 0xF8]
v5=[0xD2, 0xAC, 0xEE, 0xFD,0x2F, 0x2C, 0xFD, 0x79,0xC5, 0xDE, 0xD0, 0x85,0x58, 0xB6, 0xB6, 0x0B,0xF5, 0x39, 0xC0, 0x54,0x21, 0x1F, 0xE2, 0x54,0x02, 0x85]
flag=""
for i in range(len(v7)):flag+=chr(v7[i]^v5[i])
print(flag)
#n1book{X0r_x0R_15_s0_f1v3}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/438090.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

.NET 实现并行的几种方式(二)

本随笔续接&#xff1a;.NET 实现并行的几种方式&#xff08;一&#xff09; 四、Task 3&#xff09;Task.NET 4.5 中的简易方式 在上篇随笔中&#xff0c;两个Demo使用的是 .NET 4.0 中的方式&#xff0c;代码写起来略显麻烦&#xff0c;这不 .NET 4.5提供了更加简洁的方…

redis 和 数据库mysql之间的关系

https://www.zhihu.com/question/20734566 https://www.zhihu.com/question/19660689 http://blog.csdn.net/Ideality_hunter/article/details/77621643 redis和mysql要根据具体业务场景去选型 mysql&#xff1a;数据放在磁盘redis&#xff1a;数据放在内存 redis适合放一些…

GPS/轨迹追踪、轨迹回放、围栏控制

折腾一个多月终于弄完了这个项目&#xff0c;起初都未曾接触GPS/轨迹追踪、轨迹回放、圈划围栏...等一些在百度地图或者Googel地图操作的一些业务&#xff0c;后端的业务相对来说简单点 cas单点登录&#xff0c;mongdb灵活的数据存储方式,ActiveMQ消息推送、Redis存储... 这篇…

C#.NET Thread多线程并发编程学习与常见面试题解析-1、Thread使用与控制基础

前言&#xff1a;因为平时挺少用到多线程的&#xff0c;写游戏时都在用协程&#xff0c;至于协程那是另一个话题了&#xff0c;除了第一次学习多线程时和以前某个小项目有过就挺少有接触了&#xff0c;最近准备面试又怕被问的深入&#xff0c;所以就赶紧补补多线程基础。网上已…

PWN-PRACTICE-BUUCTF-22

PWN-PRACTICE-BUUCTF-22hitcontraining_unlinkpicoctf_2018_leak_mesuctf_2018_basic pwnaxb_2019_brop64hitcontraining_unlink unlink&#xff0c;参考&#xff1a;[BUUCTF]PWN——hitcontraining_unlink # -*- coding:utf-8 -*- from pwn import * #ioprocess("./bam…

javaee, javaweb和javase的区别以及各自的知识体系

JavaSE Java SE 以前称为 J2SE。它允许开发和部署在桌面、服务器、嵌入式环境和实时环境中使用的 Java 应用程序。Java SE 包含了支持 Java Web 服务开发的类&#xff0c;并为 Java Platform&#xff0c;Enterprise Edition&#xff08;Java EE&#xff09;提供基础。 JavaE…

.NET 实现并行的几种方式(三)

在前两篇随笔中&#xff0c;先后介绍了 Thread 、ThreadPool 、IAsyncResult (即 APM系列) 、Task 、TPL (Task Parallel Library)。 写到这些笔者突然意识到 还有一个EMP系列没有写&#xff0c;在这里补充一下&#xff1a; 六、 EAP 、EAP中的典型代表是 WebClient: EAP系…

.NET异步编程之新利器——Task与Await、Async

一. FrameWork 4.0之前的线程世界     在.NET FrameWork 4.0之前&#xff0c;如果我们使用线程。一般有以下几种方式&#xff1a; 使用System.Threading.Thread 类&#xff0c;调用实例方法Start()开启一个新线程&#xff0c;调用Abort()方法来提前终止线程。使用System.T…

对比MS Test与NUnit Test框架

前言&#xff1a; 项目中进行Unit Test时&#xff0c;肯定会用到框架&#xff0c;因为这样能够更快捷、方便的进行测试。 .Net环境下的测试框架非常多&#xff0c;在这里只是对MS Test和NUnit Test进行一下比较&#xff0c; 因为这两个框架用的较多&#xff0c;也有大虾想过…

PWN-PRACTICE-BUUCTF-25

PWN-PRACTICE-BUUCTF-25wustctf2020_name_your_catciscn_2019_final_2mrctf2020_shellcode_revengezctf2016_note2wustctf2020_name_your_cat 通过数组越界覆写返回地址为后门shell的地址 from pwn import * #ioprocess(./wustctf2020_name_your_cat) ioremote(node4.buuoj.c…

使用 Github Pages 和 Hexo 搭建自己的独立博客【超级详细的小白教程】

2022-01-25 更新&#xff1a;博客新地址&#xff1a;https://www.itbob.cn/ 欢迎关注我的专栏&#xff1a;《个人博客搭建&#xff1a;HexoGithub Pages》&#xff0c;从搭建到美化一条龙&#xff0c;帮你解决 Hexo 常见问题&#xff01; 推荐阅读&#xff1a;《Hexo 博客优化…

windows程序消息机制(Winform界面更新有关)

1. Windows程序消息机制 Windows GUI程序是基于消息机制的,有个主线程维护着消息泵。这个消息泵让windows程序生生不息。 Windows程序有个消息队列&#xff0c;窗体上的所有消息是这个队列里面消息的最主要来源。这里的While循环使用了GetMessage() 这个方法,这是个阻塞方法,也…

最新主流 Markdown 编辑器推荐

Markdown &#xff0c;2004年由 John Gruberis 设计和开发&#xff0c;是一种可以使用普通文本编辑器编写的标记语言&#xff0c;通过简单的标记语法&#xff0c;它可以使普通文本内容具有一定的格式&#xff0c;以下将介绍目前比较流行的一些 Markdown 编辑器&#xff08;排名…

PWN-PRACTICE-BUUCTF-27

PWN-PRACTICE-BUUCTF-27starctf_2019_babyshellpicoctf_2018_buffer overflow 0gyctf_2020_signinbjdctf_2020_YDSneedGrirlfriendstarctf_2019_babyshell 用\x00绕过shellcode检测&#xff0c;call rdx 跳转过去执行汇编代码&#xff0c;一个\x00必执行失败 于是需要找一条机…

敏捷开发之Scrum扫盲,及敏捷开发中XP与SCRUM的区别

敏捷开发之Scrum扫盲篇 现在敏捷开发是越来越火了&#xff0c;人人都在谈敏捷&#xff0c;人人都在学习Scrum和XP... 为了不落后他人&#xff0c;于是我也开始学习Scrum&#xff0c;今天主要是对我最近阅读的相关资料&#xff0c;根据自己的理解&#xff0c;用自己的话来讲述S…

有关不蒜子访问统计无法显示的解决方法

十月初&#xff0c;不蒜子统计失效了&#xff0c;如下图&#xff1a; 进入不蒜子官网看看&#xff1a; 问题来了&#xff0c;官网写着&#xff1a;因七牛强制过期『dn-lbstatics.qbox.me』域名&#xff0c;与客服沟通无果&#xff0c;只能更换域名到『busuanzi.ibruce.info』…

SCRUM与XP区别

敏捷开发 1、敏捷的含义 敏捷开发是一种以人为核心、迭代、增量的开发方法。在敏捷开发中&#xff0c;把一个大项目分为多个相互联系&#xff0c;可独立运行的小项目&#xff0c;并分别完成&#xff0c;在此过程中软件一直处于可使用状态。 上面提到3个关键词&#xff0c;下…

Java编写程序时出现警告:Resource leak: 'xxx' is never closed 解决方案

菜鸟新手&#xff0c;学校在教Java&#xff0c;作业里面要求我们编程实现运算一个简单的程序&#xff0c;程序写好了&#xff0c;却发现冒出一个警告&#xff0c;如下图&#xff1a; 百度了一下&#xff0c;意思是申明了名为a的数据输入扫描仪&#xff08;Scanner&#xff09…

ASP.Net请求处理机制初步探索之旅 - Part 1 前奏

开篇&#xff1a;ASP.Net是一项动态网页开发技术&#xff0c;在历史发展的长河中WebForm曾一时成为了ASP.Net的代名词&#xff0c;而ASP.Net MVC的出现让这项技术更加唤发朝气。但是&#xff0c;不管是ASP.Net WebForm还是ASP.Net MVC在请求处理机制上大部分都是相同的&#xf…

ASP.Net请求处理机制初步探索之旅 - Part 2 核心

开篇&#xff1a;上一篇我们了解了一个请求从客户端发出到服务端接收并转到ASP.Net处理入口的过程&#xff0c;这篇我们开始探索ASP.Net的核心处理部分&#xff0c;借助强大的反编译工具&#xff0c;我们会看到几个熟悉又陌生的名词&#xff08;类&#xff09;&#xff1a;Http…