好久没写博客了_(:з」∠)_回头有空补一下DEFCON的过程和题目复盘啥的…

8V

对照v8的bytecode.h很容易知道各个操作符的意义
花点时间看下来即可
主要是两个大循环,逐字节读取并异或

g4 = 88
s = b"\xd2\"\xf1\x8d\xb7\xe0\xd0MF\x87T?\x1fI\x1c\xe7\xcb\x07\xc3\x95z\xb3z\x0b\xbb\xdb\xa1I\xc5;"
output = []
for i in range(30):d = g4 ^ s[i]output.append(d)g4 = (g4*65 + 66)&0xff
for i in range(29,-1,-1):d = g4 ^ output[i]output[i] = dg4 = (g4*35-16)&0xff
print("".join([chr(i) for i in output]))

babyre

浏览一遍可以看出来很明显是一种压缩算法,简单搜了一下发现比较像LZ77,但是据说有很多变种,没找到什么好的实现就接着自己逆了
简单理解了一下原理,在buff内搜索与后17个字节相匹配的最大子串,如果有就记录下buff的下标和子串长度,没有则写入原始内容以供之后使用

简单来说就是所有数据仅出现一次,其他地方全部用偏移量表示

sub_d40函数分为两块,分别是写入和压缩
首先读入17个字节,作为写入缓冲区的初值
然后开始在buff里寻找与写入缓冲区相等的部分
如果找到匹配子串了则记录偏移和长度

并在下一次循环时写入偏移和长度

若没找到则写入一个原始字节

然后继续读入,使写入缓冲区补足17个字节

关于写入,题目使用了一个类和按位或和各种位移来实现,理解起来稍微有些复杂,但实际上就是按位写的操作

do_1代表仅写入一个位,arg2即是写入的值
do_n则是写入arg3个位,arg2是写入的值(取低位)
具体实现自行研究吧

这里的do_1即写入一个位区分接下来的若干位是原始字节还是偏移元组

算法理解后,解压缩就很容易了,照着恢复即可

话是这么说,不知道哪里没实现好,恢复出的图有很多噪点233 不过勉强还是能看出flag的

另外这个写法由于是作为字符串来处理,再加上是按位操作,所以效率奇低
wsl的python3速度要比win下的快很多,比较神奇…

# with open("test.out", "rb") as f:
with open("output.file", "rb") as f:data = f.read()
b = ""
print(len(data))
for i in range(len(data)):if i%0x100000==0:print(i)f = f"{data[i]:08b}"b += f
n = 0
output = bytearray()
while n<len(b)-13:# ori byteif b[n]=="1":n += 1c = int(b[n:n+8],2)output += bytes((c,))n += 8# compresselse:n += 1global_idx = int(b[n:n+12], 2)-1n += 12buffer_idx = int(b[n:n+4], 2)+2n += 4# print((global_idx, buffer_idx))if global_idx > len(output):output += b"\x00"*buffer_idxelse:for i in range(buffer_idx):output += output[global_idx+i:global_idx+i+1]
with open("flag", "wb") as f:f.write(output)
# print(output)

BDOnline


观察修改日期可以发现应该往system.img上去关注
解包后同样根据修改日期可以找到两个bin,分别是nmaelibstamina.so
对nmae进行逆向可知该binary起了socket监听端口,将接受到的内容分成13和5字节,前者调用了上述so的undefined函数,后者则与某个数组进行比较检查
[外链图片转存失败(img-TTvXKqpz-1566748494332)(https://raw.githubusercontent.com/whklhh/local/master/img/20190825232607.png)]
根据数组交叉引用找到赋值的地方,解密可得后5位

undefined里就是个常规的多元一次方程组了,以"|"分隔即可
[外链图片转存失败(img-JBXjkknD-1566748494333)(https://raw.githubusercontent.com/whklhh/local/master/img/20190825232806.png)]
z3求解可得

from z3 import *
input_ = [BitVec("a%d"%i, 16) for i in range(13)]
s = Solver()
v4 = input_[0];
v5 = input_[1];
v22 = input_[2];
v6 = input_[3];
v16 = input_[5];
v17 = input_[6];
v18 = input_[4];
v20 = input_[0];
v21 = input_[3];
v19 = 5 * input_[6];
v7 = input_[7];
v8 = input_[10];
v9 = input_[8];
v10 = input_[9];
v11 = input_[11];
v12 = input_[12];
v13 = v5 + v4 + v22 + v6;
v14 = v13 + v18;
s.add((v14 + 2 * v16 + v19 + 3 * v7 + v9 + v10 + v8 + v11 + v12) ^ 0x728 ==0)
s.add((3 * v10+ v5+ v4+ v22+ 2 * v6+ v18+ v16+ v19+ v7+ v9+ v8+ v11+ v12) ^ 0x6F3 ==0)
s.add((v20+ 2 * v5+ v22+ v6+ v18+ v16+ v19+ v7+ v9+ v10+ v8+ 3 * v11+ v12) ^ 0x72E ==0)
s.add((3 * v8 + v5 + v4 + 2 * v22 + v6 + v18 + v16 + v19 + v7 + v9 + v10 + v11 + v12) ^ 0x701 ==0)
s.add((v13 + 2 * v18 + v16 + v19 + v7 + 3 * v9 + v10 + v8 + v11 + v12) ^ 0x733 ==0)
s.add((11 * v17 + v14 + v16 + v7 + v9 + v10 + v8 + v11 + v12) ^ 0x704 ==0)
s.add((9 * v5 + v20 + v22 + v21 + v18 + v16 + v19 + v7 + v9 + v10 + v8 + v11 + v12) ^ 0x93E==0)
s.add((3 * v20 + v5 + v22 + v21 + v18 + v16 + v19 + v7 + v9 + v10 + v8 + v11 + 2 * v12) ^ 0x70F ==0)
s.add((3 * v5 + v20 + v22 + v21 + v18 + v16 + v19 + v7 + v9 + v10 + v8 + 2 * v11+v12) ^ 0x728 ==0)
s.add((3 * v18 + v13 + v16 + v19 + v7 + 2 * v9 + v10 + v8 + v11 + v12) ^ 0x741 ==0)
s.add((3 * v16 + v13 + v18 + v19 + 2 * v7 + v9 + v10 + v8 + v11 + v12) ^ 0x71C ==0)
s.add((3 * v21 + v5 + v4 + v22 + v18 + v16 + v19 + v7 + v9 + 2 * v10 + v8 + v11 + v12) ^ 0x703 ==0)
s.add((3 * v22 + v5 + v4 + v21 + v18 + v16 + v19 + v7 + v9 + v10 + 2 * v8 + v11 + v12) ^ 0x701 == 0)
c = s.check()
print(c)
m = s.model()
flag = ""
for i in input_:flag += chr(m[i].as_long()&0xff)
print(flag)

ReverseMe

Java层什么都没做,直接看Native层的eq函数
IDA对函数的识别有一些问题,eq函数应该是一直到0x41F0为止,这一点从ARM将数据放在函数结尾之后可以看出
函数大小需要自己修复,否则F5看起来会带有各种没头没尾的局部变量

赋值了一堆数据后进入第一个反调和check
[外链图片转存失败(img-0lffsNRp-1566748494335)(https://raw.githubusercontent.com/whklhh/local/master/img/20190825233310.png)]
该函数先读取了/proc/net/tcp,寻找5d8a,十进制表示是23946
习惯IDA的人就能够很快的反应过来这是ida_server的默认调试端口
可以通过-p指定端口绕过,也可以直接在调试的时候把这段跳过去

这里的字符串默认情况下是加密的,通过交叉引用可以找到datadiv_decode函数
[外链图片转存失败(img-IbwkfZoP-1566748494336)(https://raw.githubusercontent.com/whklhh/local/master/img/20190825233524.png)]
解密可以写IDApython脚本来读取长度和地址
由于伪代码格式高度一致,因此也可以直接正则表达式来提取数据

直接生成这样的东西,然后执行即可在idb内静态解密

下面一段则是对输入进行了简单的哈希
[外链图片转存失败(img-WTOcao8n-1566748494338)(https://i.loli.net/2019/08/25/AYLuNPfFyhwgjXl.png)]
返回值在外部check
[外链图片转存失败(img-LzuqZDE9-1566748494339)(https://i.loli.net/2019/08/25/MZtAdVDWiRxFIfC.png)]
这里先放着不管,直接绕过即可

下面是一段很明显的TEA解密

最后与之前那堆数据进行比较

于是把数据拿出来做TEA解密,可以得到两组16个字节

d=[0x4e2eb57e, 0x6da12fb0, 0x37a990f8, 0xed6ee73c, 0x5abe9835, 0x8c6de38d]
output = b""
for i in range(19):x = d[i*2+0]y = d[i*2+1]delta = 0x6526b0d9for i_ in range(32):delta = (delta + 0x61C88647)&0xfffffffftmp = delta+xy -= tmp^(16*x+0x24215F53) ^ ((x>>5)+0x37256E5F)y &= 0xffffffffx -= ((y>>5)+0x6948747B) ^ (16*y+0x67616C66)^(delta+y)x &= 0xfffffffftry:output += bytes.fromhex(hex(x)[2:])[::-1] + bytes.fromhex(hex(y)[2:])[::-1]except:print(i)break
print(output)
# flag{yhgdtu5268t

后一组解密不对,想了一下前面有一个检查len=19的地方,所以只剩3个字节了,于是根据哈希是可以直接爆破出来的

注意哈希传入的长度是i+1,即20个字节,最后一个字节补0
有一个小技巧,哈希是逐字节计算的,因为可以省去重复计算之前16个字节的部分,直接赋上初值
不过对于这个尺度的穷举来说应该无所谓吧哈哈哈

import string
t=[0x00, 0x77073096, 0xee0e612c, 0x990951ba, 0x76dc419, 0x706af48f, 0xe963a535, 0x9e6495a3, 0xedb8832, 0x79dcb8a4, 0xe0d5e91e, 0x97d2d988, 0x9b64c2b, 0x7eb17cbd, 0xe7b82d07, 0x90bf1d91, 0x1db71064, 0x6ab020f2, 0xf3b97148, 0x84be41de, 0x1adad47d, 0x6ddde4eb, 0xf4d4b551, 0x83d385c7, 0x136c9856, 0x646ba8c0, 0xfd62f97a, 0x8a65c9ec, 0x14015c4f, 0x63066cd9, 0xfa0f3d63, 0x8d080df5, 0x3b6e20c8, 0x4c69105e, 0xd56041e4, 0xa2677172, 0x3c03e4d1, 0x4b04d447, 0xd20d85fd, 0xa50ab56b, 0x35b5a8fa, 0x42b2986c, 0xdbbbc9d6, 0xacbcf940, 0x32d86ce3, 0x45df5c75, 0xdcd60dcf, 0xabd13d59, 0x26d930ac, 0x51de003a, 0xc8d75180, 0xbfd06116, 0x21b4f4b5, 0x56b3c423, 0xcfba9599, 0xb8bda50f, 0x2802b89e, 0x5f058808, 0xc60cd9b2, 0xb10be924, 0x2f6f7c87, 0x58684c11, 0xc1611dab, 0xb6662d3d, 0x76dc4190, 0x1db7106, 0x98d220bc, 0xefd5102a, 0x71b18589, 0x6b6b51f, 0x9fbfe4a5, 0xe8b8d433, 0x7807c9a2, 0xf00f934, 0x9609a88e, 0xe10e9818, 0x7f6a0dbb, 0x86d3d2d, 0x91646c97, 0xe6635c01, 0x6b6b51f4, 0x1c6c6162, 0x856530d8, 0xf262004e, 0x6c0695ed, 0x1b01a57b, 0x8208f4c1, 0xf50fc457, 0x65b0d9c6, 0x12b7e950, 0x8bbeb8ea, 0xfcb9887c, 0x62dd1ddf, 0x15da2d49, 0x8cd37cf3, 0xfbd44c65, 0x4db26158, 0x3ab551ce, 0xa3bc0074, 0xd4bb30e2, 0x4adfa541, 0x3dd895d7, 0xa4d1c46d, 0xd3d6f4fb, 0x4369e96a, 0x346ed9fc, 0xad678846, 0xda60b8d0, 0x44042d73, 0x33031de5, 0xaa0a4c5f, 0xdd0d7cc9, 0x5005713c, 0x270241aa, 0xbe0b1010, 0xc90c2086, 0x5768b525, 0x206f85b3, 0xb966d409, 0xce61e49f, 0x5edef90e, 0x29d9c998, 0xb0d09822, 0xc7d7a8b4, 0x59b33d17, 0x2eb40d81, 0xb7bd5c3b, 0xc0ba6cad, 0xedb88320, 0x9abfb3b6, 0x3b6e20c, 0x74b1d29a, 0xead54739, 0x9dd277af, 0x4db2615, 0x73dc1683, 0xe3630b12, 0x94643b84, 0xd6d6a3e, 0x7a6a5aa8, 0xe40ecf0b, 0x9309ff9d, 0xa00ae27, 0x7d079eb1, 0xf00f9344, 0x8708a3d2, 0x1e01f268, 0x6906c2fe, 0xf762575d, 0x806567cb, 0x196c3671, 0x6e6b06e7, 0xfed41b76, 0x89d32be0, 0x10da7a5a, 0x67dd4acc, 0xf9b9df6f, 0x8ebeeff9, 0x17b7be43, 0x60b08ed5, 0xd6d6a3e8, 0xa1d1937e, 0x38d8c2c4, 0x4fdff252, 0xd1bb67f1, 0xa6bc5767, 0x3fb506dd, 0x48b2364b, 0xd80d2bda, 0xaf0a1b4c, 0x36034af6, 0x41047a60, 0xdf60efc3, 0xa867df55, 0x316e8eef, 0x4669be79, 0xcb61b38c, 0xbc66831a, 0x256fd2a0, 0x5268e236, 0xcc0c7795, 0xbb0b4703, 0x220216b9, 0x5505262f, 0xc5ba3bbe, 0xb2bd0b28, 0x2bb45a92, 0x5cb36a04, 0xc2d7ffa7, 0xb5d0cf31, 0x2cd99e8b, 0x5bdeae1d, 0x9b64c2b0, 0xec63f226, 0x756aa39c, 0x26d930a, 0x9c0906a9, 0xeb0e363f, 0x72076785, 0x5005713, 0x95bf4a82, 0xe2b87a14, 0x7bb12bae, 0xcb61b38, 0x92d28e9b, 0xe5d5be0d, 0x7cdcefb7, 0xbdbdf21, 0x86d3d2d4, 0xf1d4e242, 0x68ddb3f8, 0x1fda836e, 0x81be16cd, 0xf6b9265b, 0x6fb077e1, 0x18b74777, 0x88085ae6, 0xff0f6a70, 0x66063bca, 0x11010b5c, 0x8f659eff, 0xf862ae69, 0x616bffd3, 0x166ccf45, 0xa00ae278, 0xd70dd2ee, 0x4e048354, 0x3903b3c2, 0xa7672661, 0xd06016f7, 0x4969474d, 0x3e6e77db, 0xaed16a4a, 0xd9d65adc, 0x40df0b66, 0x37d83bf0, 0xa9bcae53, 0xdebb9ec5, 0x47b2cf7f, 0x30b5ffe9, 0xbdbdf21c, 0xcabac28a, 0x53b39330, 0x24b4a3a6, 0xbad03605, 0xcdd70693, 0x54de5729, 0x23d967bf, 0xb3667a2e, 0xc4614ab8, 0x5d681b02, 0x2a6f2b94, 0xb40bbe37, 0xc30c8ea1, 0x5a05df1b, 0x2d02ef8d,]
flag = b"flag{yhgdtu5268t"
dic = string.printable.encode()
def hash(s):x = 0xffffffffx = 0x7213bed9for i in s:x = t[i^(x&0xff)]^(x>>8)return ~x&0xffffffffprint(hex(hash(flag)))
for a in dic:for b in dic:for c in dic:if hash(bytes([a,b,c,0]))==0xDDD44112:print(flag+bytes([a,b,c]))break

190825 reverse-ogeek初赛相关推荐

  1. TIANCHI天池-OGeek算法挑战赛-完整方案及代码(亚军)

    首先很幸运拿到TIANCHI天池-OGeek算法挑战赛大赛的亚军,同时非常感谢大佬队友的带飞,同时希望我的分享与总结能给大家带来些许帮助,并且一起交流学习.(作者:王贺,知乎:鱼遇雨欲语与余) 赛题链 ...

  2. 2018 “百度之星”程序设计大赛 - 初赛(A)

    hdu6374                         度度熊拼三角 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536 ...

  3. 记首次参加网络安全比赛(初赛-知识竞赛,决赛-CTF夺旗赛-解题模式)

    网络安全相关的方向很多,几乎IT相关的安全内容都可以涵盖在内.笔者本身的知识体系更偏向于编程语言和Web应用,本次参赛可谓极具挑战,但是就是喜欢这种感觉:) 赛程安排 9月16日接到通知 9月26日初 ...

  4. 发债企业的违约风险预警初赛方案【AI比赛】

    1.赛题 2.赛题解读 2.1赛题精炼 2.2特征提取 2.2.1类别特征 2.2.2数值特征 2.3特征选择 2.4时序验证 2.5模型选择 3上分攻略 4方案分享 4.1导入模块 4.2读入数据 ...

  5. 2020全国高校计算机能力挑战赛程序设计赛Python组区域赛(初赛)试题及参考解答

    2020全国高校计算机能力挑战赛程序设计赛Python组区域赛(初赛)试题及参考解答 简介 赛题构成 代码提交说明 成绩评定 2020真题 1-1 数字与相邻的前.后数字之和可以被4整除 题目 个人对 ...

  6. 2016百度之星 - 初赛(Astar Round2A)解题报告

    此文章可以使用目录功能哟↑(点击上方[+]) 有点智商捉急,第一题卡了好久,看来不服老,不服笨是不行的了...以下是本人目前的题解,有什么疑问欢迎提出 链接→2016"百度之星" ...

  7. 2022西湖论剑-初赛CTF部分wp-Zodiac

    2022西湖论剑-初赛CTF部分wp-Zodiac 文章目录 2022西湖论剑-初赛CTF部分wp-Zodiac WEB real_ez_node 扭转乾坤 Node Magical Login PW ...

  8. 【比赛回顾】2020广工文远知行杯新生程序设计竞赛(初赛)

    [比赛回顾]2020广工文远知行杯新生程序设计竞赛(初赛) 写在前面: 已经更新完除E和F以外的题解(因为这两道我没有时间做了,以后抽空做完后补充).可能我的题解并不是最优的,欢迎交流和讨论~ 文章目 ...

  9. 206. Reverse Linked List

    Reverse a singly linked list. 反转单链表 C++(9ms):  迭代 1 /** 2 * Definition for singly-linked list. 3 * s ...

  10. NOIP2018TG 初赛复习

    Date: 20180911 TCP/IP OSI7 面向对象的程序设计语言 1.不是自顶向下 2.simula 67语言 第一个 3.继承性.封装性.多态性 NOIP支持的语言环境: 对于c / c ...

最新文章

  1. mkisofs简单定制linux iso
  2. PMCAFF产品经理第一课 | 深圳站 现场集锦
  3. 算法6:只有五行的Floyd最短路算法
  4. Python-Pandas之两个Dataframe的差异比较
  5. 利用可视化软件navicat查看表的sql语句
  6. Linux多任务编程(三)---exec函数族及其基础实验
  7. “玲珑杯”郑州轻工业学院第八届ACM程序设计大赛Problem G: 蛤玮点菜
  8. bootstrap-validation 对表单进行比较全的验证
  9. unsatisfied condition: __STDC_VERSION__ = 201112L
  10. PopClip for Mac(剪切板复制粘贴工具)
  11. PLC液压控制系列之比例流量阀结构分析
  12. acwing1282. 搜索关键词(AC 自动机)
  13. java 水晶按钮_java渲染水晶按钮
  14. 标签打印机打印亚马逊外箱FBA标签
  15. 开源php官方团队解散,php语言大厦将倾?
  16. 解决go数据表查询结构体对应字段null问题(sqlx converting NULL to string is unsupported)
  17. html中的那些炫酷吊炸天的操作
  18. VMware卸载不干净导致无法重安
  19. 指针详讲(一阶指针和二阶指针等指针各种用法详解)
  20. c语言课程设计人事管理,C语言课程设计-人事管理系统(65页).doc

热门文章

  1. ora 01033 oracle initialization,ora-01033:oracle initialization or shutdown in progress 解决方法
  2. java 多线程m3u8下载
  3. Vue中阿里图标的使用
  4. linux系统FW升降级步骤,一种用于在Linux系统下不重启系统实现LSIRAID卡FW升级的方法与流程...
  5. TCPClient代码
  6. 常见图像加密性能评价指标(详解加python实现)
  7. 手把手教你安装黑苹果之openCore-0.6.3 EFI制作全过程,非常详细
  8. USB3300速度调试
  9. win7旗舰版安装oracle11g
  10. 8700k超频测试软件,双节+双核,i7 8700k +Z370 Extreme4超频测试