- [目录]

  • 分析
  • 脚本
  • 总结

GW CTF2019 babyvm 复现
得到一个文件 先exeinfope 64位elf文件

打开后找到main函数

第一个是初始化,第二个是退出,第三个检查flag(但是分析完会发现这个是假的)
init进去后 分析完后

分析完后根据自己理解分析出他的指令集
|0xF1|MOV |
|0xF2|XOR–|
|0xF4|NOP |
|0xF5|read_str |
|0xF7|computing–|
|0xF6 |mul |
|0xF8|swap |

python写个脚本看看干了什么

opcode=[  0xF5, 0xF1, 0xE1, 0x00, 0x00, 0x00, 0x00, 0xF2, 0xF1, 0xE4,0x20, 0x00, 0x00, 0x00, 0xF1, 0xE1, 0x01, 0x00, 0x00, 0x00,0xF2, 0xF1, 0xE4, 0x21, 0x00, 0x00, 0x00, 0xF1, 0xE1, 0x02,0x00, 0x00, 0x00, 0xF2, 0xF1, 0xE4, 0x22, 0x00, 0x00, 0x00,0xF1, 0xE1, 0x03, 0x00, 0x00, 0x00, 0xF2, 0xF1, 0xE4, 0x23,0x00, 0x00, 0x00, 0xF1, 0xE1, 0x04, 0x00, 0x00, 0x00, 0xF2,0xF1, 0xE4, 0x24, 0x00, 0x00, 0x00, 0xF1, 0xE1, 0x05, 0x00,0x00, 0x00, 0xF2, 0xF1, 0xE4, 0x25, 0x00, 0x00, 0x00, 0xF1,0xE1, 0x06, 0x00, 0x00, 0x00, 0xF2, 0xF1, 0xE4, 0x26, 0x00,0x00, 0x00, 0xF1, 0xE1, 0x07, 0x00, 0x00, 0x00, 0xF2, 0xF1,0xE4, 0x27, 0x00, 0x00, 0x00, 0xF1, 0xE1, 0x08, 0x00, 0x00,0x00, 0xF2, 0xF1, 0xE4, 0x28, 0x00, 0x00, 0x00, 0xF1, 0xE1,0x09, 0x00, 0x00, 0x00, 0xF2, 0xF1, 0xE4, 0x29, 0x00, 0x00,0x00, 0xF1, 0xE1, 0x0A, 0x00, 0x00, 0x00, 0xF2, 0xF1, 0xE4,0x2A, 0x00, 0x00, 0x00, 0xF1, 0xE1, 0x0B, 0x00, 0x00, 0x00,0xF2, 0xF1, 0xE4, 0x2B, 0x00, 0x00, 0x00, 0xF1, 0xE1, 0x0C,0x00, 0x00, 0x00, 0xF2, 0xF1, 0xE4, 0x2C, 0x00, 0x00, 0x00,0xF1, 0xE1, 0x0D, 0x00, 0x00, 0x00, 0xF2, 0xF1, 0xE4, 0x2D,0x00, 0x00, 0x00, 0xF1, 0xE1, 0x0E, 0x00, 0x00, 0x00, 0xF2,0xF1, 0xE4, 0x2E, 0x00, 0x00, 0x00, 0xF1, 0xE1, 0x0F, 0x00,0x00, 0x00, 0xF2, 0xF1, 0xE4, 0x2F, 0x00, 0x00, 0x00, 0xF1,0xE1, 0x10, 0x00, 0x00, 0x00, 0xF2, 0xF1, 0xE4, 0x30, 0x00,0x00, 0x00, 0xF1, 0xE1, 0x11, 0x00, 0x00, 0x00, 0xF2, 0xF1,0xE4, 0x31, 0x00, 0x00, 0x00, 0xF1, 0xE1, 0x12, 0x00, 0x00,0x00, 0xF2, 0xF1, 0xE4, 0x32, 0x00, 0x00, 0x00, 0xF1, 0xE1,0x13, 0x00, 0x00, 0x00, 0xF2, 0xF1, 0xE4, 0x33, 0x00, 0x00,0x00, 0xF4, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xF5, 0xF1,0xE1, 0x00, 0x00, 0x00, 0x00, 0xF1, 0xE2, 0x01, 0x00, 0x00,0x00, 0xF2, 0xF1, 0xE4, 0x00, 0x00, 0x00, 0x00, 0xF1, 0xE1,0x01, 0x00, 0x00, 0x00, 0xF1, 0xE2, 0x02, 0x00, 0x00, 0x00,0xF2, 0xF1, 0xE4, 0x01, 0x00, 0x00, 0x00, 0xF1, 0xE1, 0x02,0x00, 0x00, 0x00, 0xF1, 0xE2, 0x03, 0x00, 0x00, 0x00, 0xF2,0xF1, 0xE4, 0x02, 0x00, 0x00, 0x00, 0xF1, 0xE1, 0x03, 0x00,0x00, 0x00, 0xF1, 0xE2, 0x04, 0x00, 0x00, 0x00, 0xF2, 0xF1,0xE4, 0x03, 0x00, 0x00, 0x00, 0xF1, 0xE1, 0x04, 0x00, 0x00,0x00, 0xF1, 0xE2, 0x05, 0x00, 0x00, 0x00, 0xF2, 0xF1, 0xE4,0x04, 0x00, 0x00, 0x00, 0xF1, 0xE1, 0x05, 0x00, 0x00, 0x00,0xF1, 0xE2, 0x06, 0x00, 0x00, 0x00, 0xF2, 0xF1, 0xE4, 0x05,0x00, 0x00, 0x00, 0xF1, 0xE1, 0x06, 0x00, 0x00, 0x00, 0xF1,0xE2, 0x07, 0x00, 0x00, 0x00, 0xF1, 0xE3, 0x08, 0x00, 0x00,0x00, 0xF1, 0xE5, 0x0C, 0x00, 0x00, 0x00, 0xF6, 0xF7, 0xF1,0xE4, 0x06, 0x00, 0x00, 0x00, 0xF1, 0xE1, 0x07, 0x00, 0x00,0x00, 0xF1, 0xE2, 0x08, 0x00, 0x00, 0x00, 0xF1, 0xE3, 0x09,0x00, 0x00, 0x00, 0xF1, 0xE5, 0x0C, 0x00, 0x00, 0x00, 0xF6,0xF7, 0xF1, 0xE4, 0x07, 0x00, 0x00, 0x00, 0xF1, 0xE1, 0x08,0x00, 0x00, 0x00, 0xF1, 0xE2, 0x09, 0x00, 0x00, 0x00, 0xF1,0xE3, 0x0A, 0x00, 0x00, 0x00, 0xF1, 0xE5, 0x0C, 0x00, 0x00,0x00, 0xF6, 0xF7, 0xF1, 0xE4, 0x08, 0x00, 0x00, 0x00, 0xF1,0xE1, 0x0D, 0x00, 0x00, 0x00, 0xF1, 0xE2, 0x13, 0x00, 0x00,0x00, 0xF8, 0xF1, 0xE4, 0x0D, 0x00, 0x00, 0x00, 0xF1, 0xE7,0x13, 0x00, 0x00, 0x00, 0xF1, 0xE1, 0x0E, 0x00, 0x00, 0x00,0xF1, 0xE2, 0x12, 0x00, 0x00, 0x00, 0xF8, 0xF1, 0xE4, 0x0E,0x00, 0x00, 0x00, 0xF1, 0xE7, 0x12, 0x00, 0x00, 0x00, 0xF1,0xE1, 0x0F, 0x00, 0x00, 0x00, 0xF1, 0xE2, 0x11, 0x00, 0x00,0x00, 0xF8, 0xF1, 0xE4, 0x0F, 0x00, 0x00, 0x00, 0xF1, 0xE7,0x11, 0x00, 0x00, 0x00, 0xF]
reg = {0xe1:'eax',0xe2:'ebx',0xe3:'ecx',0xe5:'edx'}
operation = {0xf1:'mov',0xf2:'xor',0xf5:'read',0xf4:'nop',0xf7:'add',0xf8:'swap',0xf6:'mul'}
i = 0
for j in range(len(opcode)):if(opcode[i] == 0xF1 ):print('mov ',end='')if (opcode[i+1] == 0xe1):print('eax ' + 'flag[' + str(opcode[i + 2]) + ']')elif(opcode[i+1] == 0xe2):print('ebx '+'flag['+str(opcode[i+2])+']')elif(opcode[i+1] == 0xe3):print('ecx ','flag['+str(opcode[i+2])+']')elif(opcode[i+1] == 0xe4):print('flag['+str(opcode[i+2])+'] '+'eax')elif(opcode[i+1] == 0xe5):print('edx '+'flag['+str(opcode[i+2])+']')elif(opcode[i+1] == 0xe7):print('flag['+str(opcode[i+2])+'] '+'ebx')i+=6elif(opcode[i] == 0xf2):print('xor eax ecx')i+=1elif(opcode[i] == 0xf5):print('read')i+=1elif(opcode[i] == 0xf4):print('nop')i+=1elif(opcode[i] == 0xf7):print('eax=eax*ecx')i+=1elif(opcode[i] == 0xf8):print('swap eax ebx')i+=1elif(opcode[i] == 0xf6):print('mul eax=ecx+2*ebx+3*eax')i+=1else:i+=1
```python
在这里插入代码片
read
mov eax flag[0]
xor eax ecx
mov flag[32] eax
mov eax flag[1]
xor eax ecx
mov flag[33] eax
mov eax flag[2]
xor eax ecx
mov flag[34] eax
mov eax flag[3]
xor eax ecx
mov flag[35] eax
mov eax flag[4]
xor eax ecx
mov flag[36] eax
mov eax flag[5]
xor eax ecx
mov flag[37] eax
mov eax flag[6]
xor eax ecx
mov flag[38] eax
mov eax flag[7]
xor eax ecx
mov flag[39] eax
mov eax flag[8]
xor eax ecx
mov flag[40] eax
mov eax flag[9]
xor eax ecx
mov flag[41] eax
mov eax flag[10]
xor eax ecx
mov flag[42] eax
mov eax flag[11]
xor eax ecx
mov flag[43] eax
mov eax flag[12]
xor eax ecx
mov flag[44] eax
mov eax flag[13]
xor eax ecx
mov flag[45] eax
mov eax flag[14]
xor eax ecx
mov flag[46] eax
mov eax flag[15]
xor eax ecx
mov flag[47] eax
mov eax flag[16]
xor eax ecx
mov flag[48] eax
mov eax flag[17]
xor eax ecx
mov flag[49] eax
mov eax flag[18]
xor eax ecx
mov flag[50] eax
mov eax flag[19]
xor eax ecx
mov flag[51] eax
nop
read
mov eax flag[0]
mov ebx flag[1]
xor eax ecx
mov flag[0] eax
mov eax flag[1]
mov ebx flag[2]
xor eax ecx
mov flag[1] eax
mov eax flag[2]
mov ebx flag[3]
xor eax ecx
mov flag[2] eax
mov eax flag[3]
mov ebx flag[4]
xor eax ecx
mov flag[3] eax
mov eax flag[4]
mov ebx flag[5]
xor eax ecx
mov flag[4] eax
mov eax flag[5]
mov ebx flag[6]
xor eax ecx
mov flag[5] eax
mov eax flag[6]
mov ebx flag[7]
mov ecx  flag[8]
mov edx flag[12]
mul eax=ecx+2*ebx+3*eax
eax=eax*ecx
mov flag[6] eax
mov eax flag[7]
mov ebx flag[8]
mov ecx  flag[9]
mov edx flag[12]
mul eax=ecx+2*ebx+3*eax
eax=eax*ecx
mov flag[7] eax
mov eax flag[8]
mov ebx flag[9]
mov ecx  flag[10]
mov edx flag[12]
mul eax=ecx+2*ebx+3*eax
eax=eax*ecx
mov flag[8] eax
mov eax flag[13]
mov ebx flag[19]
swap eax ebx
mov flag[13] eax
mov flag[19] ebx
mov eax flag[14]
mov ebx flag[18]
swap eax ebx
mov flag[14] eax
mov flag[18] ebx
mov eax flag[15]
mov ebx flag[17]
swap eax ebx
mov flag[15] eax
mov flag[17] ebx

可以发现进行了两次输出,第一次是假的,因为从输入函数可知flag21位

所以大致的加密算法为

flag=''
for i in range(6)::flag[i]=flag[i]^flag[i+1]flag[6]=(flag[8]+2*flag[7]+3*flag[6])*flag[12]
flag[7]=(flag[9]+2*flag[8]+3*flag[7])*flag[12]
flag[8]=(flag[10]+2*flag[9]+3*flag[8])*flag[12]
swap(flag[13],flag[19])
swap(flag[14],flag[18])
swap(flag[15],flag[17])

直接上脚本,这里要注意check里边的是假的 真正的是这个

check = [0x69, 0x45, 0x2A, 0x37, 0x09, 0x17, 0xC5, 0x0B, 0x5C, 0x72,0x33, 0x76, 0x33, 0x21, 0x74, 0x31, 0x5F, 0x33, 0x73, 0x72]check[13], check[19] = check[19], check[13]
check[14], check[18] = check[18], check[14]
check[15], check[17] = check[17], check[15]for i in range(128):if check[8] == ((i*3 + check[9]*2 + check[10])*check[12])&0xff:check[8] = ifor j in range(128):if check[7] == ((j * 3 + check[8] * 2 + check[9]) * check[12]) & 0xff:check[7] = jfor k in range(128):if check[6] == ((k * 3 + check[7] * 2 + check[8]) * check[12]) & 0xff:check[6] = kfor i in range(6)[::-1]:check[i] ^= check[i+1]flag = ''
for i in range(len(check)):flag += chr(check[i])
print(flag)
# Y0u_hav3_r3v3rs3_1t!

[GW-CTF2019] babyvm相关推荐

  1. [蛋蛋の涂鸦日记]02-致电通渠中心

    角色出演:某蛋.薰薰.小熊 上海这边的大叔都怎么啦!? 更年期综合证发作?? 唉--什么世道... 往期链接:[蛋蛋の涂鸦日记]01-某蛋的上海买菜记 转载于:https://www.cnblogs. ...

  2. [斯坦福创业课]Jeff谈LinkedIn的同理心管理

    [斯坦福创业课]Jeff谈LinkedIn的同理心管理 ​2008年底 Jeff Weiner以总裁的身份加入LinkedIn,之后担任首席执行官.他的到来使LinkedIn的使命.价值观以及战略重点 ...

  3. 中科院计算机和理论物理双硕士白,[中科院物理研究所]2005年硕士招生专业及研究方向_跨考网...

    [中科院物理研究所]2005年硕士招生专业及研究方向 主要研究方向 1.高温超导体机理.BEC理论及自旋电子学相关理论研究. 2.凝聚态理论: 3.原子分子物理.量子光学和量子信息理论: 4.统计物理 ...

  4. [猜你喜欢]冠军 yes,boy! 分享 | 推荐系统也可以很简单 做个记录 以后方便学习

    DC 关于分享 无论是充满"魔性"的"yes,boy!"这个昵称,还是诸神无法超越的7.89645分,都让这次[猜你喜欢]冠军充满了神秘色彩,最关键的是,&qu ...

  5. 博客生活的另一种境界![博友话题]

    这篇文章开了个头就嘎然而止,一方面因为我没有整理好思路,一方面我看了别的博友写的同系列文章,决定观望为先,学习为主. 终于今天看到:[url]http://liuyu.blog.51cto.com/1 ...

  6. [android开发必备]Android开发者社区汇总

    [android开发必备]Android开发者社区汇总 经常收到很多人问做android开发去哪个社区,每次都回答的零零碎碎的很比系统,今天统一整理下,把截至目前为止有价值的android开发社区汇总 ...

  7. [H5案例课程]连连看H5小游戏的制作-岑远科-专题视频课程

    [H5案例课程]连连看H5小游戏的制作-2054人已学习 课程介绍         主要针对Mugeda有一定基础的同学,购买前请先学习初级课程,初级课程地址: http://edu.csdn.net ...

  8. DataCastle[猜你喜欢]推荐系统竞赛——Kuhung思路及代码

    概况介绍 我是参加DataCastle[猜你喜欢]推荐系统的kuhung.在截止竞赛日期的测评榜中,我的团队--猜你不喜欢,以7.86565的最终成绩,位居第二.接下来我将分享我的比赛心得及才赛代码. ...

  9. 技惊四座,全新视觉,强悍街舞!——[全美最佳舞团]第3季冠军! Quest Crew 表演合集 (清晰版) 【收藏】

    技惊四座,全新视觉,强悍街舞!--[全美最佳舞团]第3季冠军! Quest Crew 表演合集 (清晰版) [收藏] 更换后的编辑器更差劲了.很多BUG..... 这段插入引用视频的代码,无法识别.老 ...

  10. [cocos2d-x][apk打包][Fatal signal 11][andriod]Eclipse编译Fatal signal 11报错-都是字符赋值惹的祸...

    流程重现: 使用coco2d-x制作了一个2048,在xcode模拟器执行以及在pad上真机调试都是没有问题的. 可是在使用eclipse调试打包android可以执行,可是进入游戏之后会在随机的地方 ...

最新文章

  1. 小白的Unity5之路(一)
  2. python 图表_做自己漂亮的图表,一文学会如何用Python填充图表样式
  3. 当我们在谈深度学习时,到底在谈论什么(一)--转
  4. 如何移动SQL SERVER的系统数据库
  5. 在Docker中的ubuntu中安装Python3和Pip
  6. 深入学习SAP UI5框架代码系列之四:SAP UI5控件的元数据实现
  7. 【图像超分辨率】遥感数据的高斯金字塔尺度上推方法研究
  8. 新手攻略熔炉_我的世界攻略:生存模式新手攻略
  9. 一步一步安装 Windows Server 2008 Beta3(Code Name Longhorn)
  10. Linux内核学习(八):linux内核配置与模块
  11. Java实现计算矩阵的伴随矩阵、逆矩阵
  12. 关于magic-api的使用入门
  13. c语言:从键盘输入两个正整数,求其最大公约数和最小公倍数
  14. css进阶四(多媒体嵌入)
  15. 如何在Win10(包括2004版本)下安装64位CATIA
  16. 推荐三大文献检索下载网站,超级实用!重点是免费
  17. spring aop 执行顺序(@Before @Around @After @AfterReturning @AfterThrowing)
  18. ★人眼到底等于多少像素 ?
  19. 20140601-百家讲坛
  20. C++_计算字符串长度

热门文章

  1. XTDRONE:ego_planner三维运动规划
  2. CPA、CPS、CPC、CPM推广是什么意思
  3. 数字万用表判断绝缘栅场效应管的好坏
  4. python取地址符_C中指针符*和取址符
  5. 华为digix算法大赛2020机器学习赛道-搜索相关性初赛A/B榜rank1
  6. 2005年国内最有份量的资源下载网站一览
  7. matlab绘正态/卡方/t/F分布概率密度图
  8. PowerShell中使用WMI或CIM
  9. jQuery 遍历 - find() 方法
  10. java鼠标乱跑_win7鼠标光标乱跳怎么办?解决win7鼠标光标乱跑的方法