逆向:python解码得flag

  • 背景
  • python解码
    • 分析
    • 代码
    • 运行结果
  • 总结

背景

入门逆向题:bugku上面的“游戏过关”题。
发现flag生成的函数,找到汇编代码,查看其对应的C伪代码:
(分行有点多,别在意这些数据,权当这些是一条数据就行了)

int sub_45E940()
{signed int i; // [esp+D0h] [ebp-94h]char v2; // [esp+DCh] [ebp-88h]char v3; // [esp+DDh] [ebp-87h]char v4; // [esp+DEh] [ebp-86h]char v5; // [esp+DFh] [ebp-85h]char v6; // [esp+E0h] [ebp-84h]char v7; // [esp+E1h] [ebp-83h]char v8; // [esp+E2h] [ebp-82h]char v9; // [esp+E3h] [ebp-81h]char v10; // [esp+E4h] [ebp-80h]char v11; // [esp+E5h] [ebp-7Fh]char v12; // [esp+E6h] [ebp-7Eh]char v13; // [esp+E7h] [ebp-7Dh]char v14; // [esp+E8h] [ebp-7Ch]char v15; // [esp+E9h] [ebp-7Bh]char v16; // [esp+EAh] [ebp-7Ah]char v17; // [esp+EBh] [ebp-79h]char v18; // [esp+ECh] [ebp-78h]char v19; // [esp+EDh] [ebp-77h]char v20; // [esp+EEh] [ebp-76h]char v21; // [esp+EFh] [ebp-75h]char v22; // [esp+F0h] [ebp-74h]char v23; // [esp+F1h] [ebp-73h]char v24; // [esp+F2h] [ebp-72h]char v25; // [esp+F3h] [ebp-71h]char v26; // [esp+F4h] [ebp-70h]char v27; // [esp+F5h] [ebp-6Fh]char v28; // [esp+F6h] [ebp-6Eh]char v29; // [esp+F7h] [ebp-6Dh]char v30; // [esp+F8h] [ebp-6Ch]char v31; // [esp+F9h] [ebp-6Bh]char v32; // [esp+FAh] [ebp-6Ah]char v33; // [esp+FBh] [ebp-69h]char v34; // [esp+FCh] [ebp-68h]char v35; // [esp+FDh] [ebp-67h]char v36; // [esp+FEh] [ebp-66h]char v37; // [esp+FFh] [ebp-65h]char v38; // [esp+100h] [ebp-64h]char v39; // [esp+101h] [ebp-63h]char v40; // [esp+102h] [ebp-62h]char v41; // [esp+103h] [ebp-61h]char v42; // [esp+104h] [ebp-60h]char v43; // [esp+105h] [ebp-5Fh]char v44; // [esp+106h] [ebp-5Eh]char v45; // [esp+107h] [ebp-5Dh]char v46; // [esp+108h] [ebp-5Ch]char v47; // [esp+109h] [ebp-5Bh]char v48; // [esp+10Ah] [ebp-5Ah]char v49; // [esp+10Bh] [ebp-59h]char v50; // [esp+10Ch] [ebp-58h]char v51; // [esp+10Dh] [ebp-57h]char v52; // [esp+10Eh] [ebp-56h]char v53; // [esp+10Fh] [ebp-55h]char v54; // [esp+110h] [ebp-54h]char v55; // [esp+111h] [ebp-53h]char v56; // [esp+112h] [ebp-52h]char v57; // [esp+113h] [ebp-51h]char v58; // [esp+114h] [ebp-50h]char v59; // [esp+120h] [ebp-44h]char v60; // [esp+121h] [ebp-43h]char v61; // [esp+122h] [ebp-42h]char v62; // [esp+123h] [ebp-41h]char v63; // [esp+124h] [ebp-40h]char v64; // [esp+125h] [ebp-3Fh]char v65; // [esp+126h] [ebp-3Eh]char v66; // [esp+127h] [ebp-3Dh]char v67; // [esp+128h] [ebp-3Ch]char v68; // [esp+129h] [ebp-3Bh]char v69; // [esp+12Ah] [ebp-3Ah]char v70; // [esp+12Bh] [ebp-39h]char v71; // [esp+12Ch] [ebp-38h]char v72; // [esp+12Dh] [ebp-37h]char v73; // [esp+12Eh] [ebp-36h]char v74; // [esp+12Fh] [ebp-35h]char v75; // [esp+130h] [ebp-34h]char v76; // [esp+131h] [ebp-33h]char v77; // [esp+132h] [ebp-32h]char v78; // [esp+133h] [ebp-31h]char v79; // [esp+134h] [ebp-30h]char v80; // [esp+135h] [ebp-2Fh]char v81; // [esp+136h] [ebp-2Eh]char v82; // [esp+137h] [ebp-2Dh]char v83; // [esp+138h] [ebp-2Ch]char v84; // [esp+139h] [ebp-2Bh]char v85; // [esp+13Ah] [ebp-2Ah]char v86; // [esp+13Bh] [ebp-29h]char v87; // [esp+13Ch] [ebp-28h]char v88; // [esp+13Dh] [ebp-27h]char v89; // [esp+13Eh] [ebp-26h]char v90; // [esp+13Fh] [ebp-25h]char v91; // [esp+140h] [ebp-24h]char v92; // [esp+141h] [ebp-23h]char v93; // [esp+142h] [ebp-22h]char v94; // [esp+143h] [ebp-21h]char v95; // [esp+144h] [ebp-20h]char v96; // [esp+145h] [ebp-1Fh]char v97; // [esp+146h] [ebp-1Eh]char v98; // [esp+147h] [ebp-1Dh]char v99; // [esp+148h] [ebp-1Ch]char v100; // [esp+149h] [ebp-1Bh]char v101; // [esp+14Ah] [ebp-1Ah]char v102; // [esp+14Bh] [ebp-19h]char v103; // [esp+14Ch] [ebp-18h]char v104; // [esp+14Dh] [ebp-17h]char v105; // [esp+14Eh] [ebp-16h]char v106; // [esp+14Fh] [ebp-15h]char v107; // [esp+150h] [ebp-14h]char v108; // [esp+151h] [ebp-13h]char v109; // [esp+152h] [ebp-12h]char v110; // [esp+153h] [ebp-11h]char v111; // [esp+154h] [ebp-10h]char v112; // [esp+155h] [ebp-Fh]char v113; // [esp+156h] [ebp-Eh]char v114; // [esp+157h] [ebp-Dh]char v115; // [esp+158h] [ebp-Ch]sub_45A7BE("done!!! the flag is ");v59 = 18;v60 = 64;v61 = 98;v62 = 5;v63 = 2;v64 = 4;v65 = 6;v66 = 3;v67 = 6;v68 = 48;v69 = 49;v70 = 65;v71 = 32;v72 = 12;v73 = 48;v74 = 65;v75 = 31;v76 = 78;v77 = 62;v78 = 32;v79 = 49;v80 = 32;v81 = 1;v82 = 57;v83 = 96;v84 = 3;v85 = 21;v86 = 9;v87 = 4;v88 = 62;v89 = 3;v90 = 5;v91 = 4;v92 = 1;v93 = 2;v94 = 3;v95 = 44;v96 = 65;v97 = 78;v98 = 32;v99 = 16;v100 = 97;v101 = 54;v102 = 16;v103 = 44;v104 = 52;v105 = 32;v106 = 64;v107 = 89;v108 = 45;v109 = 32;v110 = 65;v111 = 15;v112 = 34;v113 = 18;v114 = 16;v115 = 0;v2 = 123;v3 = 32;v4 = 18;v5 = 98;v6 = 119;v7 = 108;v8 = 65;v9 = 41;v10 = 124;v11 = 80;v12 = 125;v13 = 38;v14 = 124;v15 = 111;v16 = 74;v17 = 49;v18 = 83;v19 = 108;v20 = 94;v21 = 108;v22 = 84;v23 = 6;v24 = 96;v25 = 83;v26 = 44;v27 = 121;v28 = 104;v29 = 110;v30 = 32;v31 = 95;v32 = 117;v33 = 101;v34 = 99;v35 = 123;v36 = 127;v37 = 119;v38 = 96;v39 = 48;v40 = 107;v41 = 71;v42 = 92;v43 = 29;v44 = 81;v45 = 107;v46 = 90;v47 = 85;v48 = 64;v49 = 12;v50 = 43;v51 = 76;v52 = 86;v53 = 13;v54 = 114;v55 = 1;v56 = 117;v57 = 126;v58 = 0;for ( i = 0; i < 56; ++i ){*(&v2 + i) ^= *(&v59 + i);*(&v2 + i) ^= 0x13u;}return sub_45A7BE("%s\n");
}

得到了flag的生成逻辑:
两步异或运算:先将v2-v58分别与v59-v115进行异或,再分别与十六进制数0x13异或

python解码

其实使用c语言也可以解,但是学了过去很长时间了,C使用起来又不方便,所以,我还是决定用我心心念念的python。

分析

通过上面的C伪代码可以得到v2~v115的数据,但格式不对哇。数字这么多,一个一个修改吗?想想办法:
将数据复制到txt文件中,使用其替换功能处理数据。

  1. 先去除空格(将空格替换为空)
  2. 将v换成’v
  3. 将=换成’:
    这样,不就得出了python字典中数据的格式了嘛。

代码

str_1 = {'v59':18,
'v60':64,
'v61':98,
'v62':5,
'v63':2,
'v64':4,
'v65':6,
'v66':3,
'v67':6,
'v68':48,
'v69':49,
'v70':65,
'v71':32,
'v72':12,
'v73':48,
'v74':65,
'v75':31,
'v76':78,
'v77':62,
'v78':32,
'v79':49,
'v80':32,
'v81':1,
'v82':57,
'v83':96,
'v84':3,
'v85':21,
'v86':9,
'v87':4,
'v88':62,
'v89':3,
'v90':5,
'v91':4,
'v92':1,
'v93':2,
'v94':3,
'v95':44,
'v96':65,
'v97':78,
'v98':32,
'v99':16,
'v100':97,
'v101':54,
'v102':16,
'v103':44,
'v104':52,
'v105':32,
'v106':64,
'v107':89,
'v108':45,
'v109':32,
'v110':65,
'v111':15,
'v112':34,
'v113':18,
'v114':16,
'v115':0,
'v2':123,
'v3':32,
'v4':18,
'v5':98,
'v6':119,
'v7':108,
'v8':65,
'v9':41,
'v10':124,
'v11':80,
'v12':125,
'v13':38,
'v14':124,
'v15':111,
'v16':74,
'v17':49,
'v18':83,
'v19':108,
'v20':94,
'v21':108,
'v22':84,
'v23':6,
'v24':96,
'v25':83,
'v26':44,
'v27':121,
'v28':104,
'v29':110,
'v30':32,
'v31':95,
'v32':117,
'v33':101,
'v34':99,
'v35':123,
'v36':127,
'v37':119,
'v38':96,
'v39':48,
'v40':107,
'v41':71,
'v42':92,
'v43':29,
'v44':81,
'v45':107,
'v46':90,
'v47':85,
'v48':64,
'v49':12,
'v50':43,
'v51':76,
'v52':86,
'v53':13,
'v54':114,
'v55':1,
'v56':117,
'v57':126,
'v58':0,
}
n = 57  #列表长度#初始化列表
a = [0 for i in range(n)]   # 用来存储v2~v58
b = [0 for i in range(n)]   # 用来存储v59~v115
c = [0 for i in range(n)]   # 用来存储经过计算后的值# 将字典中的v2~v58按照顺序存储至a列表
for i in range(57):i = i + 2j = str(i)  # 将i转化成str类型,赋值给j,如果这里不进行类型转化,下一步的字符串连接就会报错a[i-2] = str_1['v'+ j]     # 'v'+j表示字符串连接# 将字典中的v59~v115按照顺序存储至b列表
for i in range(57):p = i +59j = str(p)b[i] = str_1['v'+ j]
flag = ''   # 定义字符串flag# 按照汇编程序的逻辑进行计算,并将计算结果存入c列表
for i in range(57):c[i] = a[i]^b[i]^0x13   # 两步异或运算:先将v2~v58分别与v59~v115进行异或,再分别与十六进制数0x13异或flag += chr(c[i])       # 将计算后的结果解码并依次连接到flag字符串上# 输出flag
print(flag)

具体处理过程代码注释已标明。

运行结果


复制flag就得到答案了。

总结

处理时要会变通,txt或者word的替换功能还是很香的。
具体解码算法分析源汇编程序不难得出的。

python在逆向中的应用——解码得到flag相关推荐

  1. python读文件的解码方式_跳过Python文件读取中的不可解码字符

    我有一个csv文件,我想用Python读取它.当我使用下面的代码片段时,我得到一个错误.在with open(input_file, 'r') as file: self.md = file.read ...

  2. 如何解决python中编码错误的问题_【总结】Python 2.x中常见字符编码和解码方面的错误及其解决办法...

    该楼层疑似违规已被系统折叠 隐藏此楼查看此楼 对于Python解析器 而Python解析器所干的事情,就是: Python解析器,根据当前的所用的字符串编码类型 此字符串编码类型,是你自己所设置的 不 ...

  3. python2发送http不编码_[转]Python 2.x中常见字符编码和解码方面的错误及其解决办法...

    Python 2.x中的字符编码,设计的的确不好,导致初学者,甚至是即使用Python很长时间的人,都会经常遇到字符编解码方面的错误. 下面就把一些常见情,尽量的都整理出来,并给出相应的解决办法. 看 ...

  4. 【2021.12.25】ctf逆向中常见加密算法和编码识别

    [2021.12.25]ctf逆向中常见加密算法和编码识别(含exe及wp) 文章目录 [2021.12.25]ctf逆向中常见加密算法和编码识别(含exe及wp) 0.前言 1.基础加密手法 2.b ...

  5. python 中文转unicode编码_Python 解码 Unicode 转义字符串

    其实,这里要讨论的内容是针对 Python2 的,实际上也是 Python2 中让人头疼的编码问题,而 Python3 则好处理得多. 先来看看例子: >>> s = "我 ...

  6. python字符集_PYTHON 中的字符集

    Python中的字符编码是个老生常谈的话题,今天来梳理一下相关知识,希望给其他人些许帮助. Python2的 默认编码 是ASCII,不能识别中文字符,需要显式指定字符编码:Python3的 默认编码 ...

  7. 详解python 3下文本文件的编解码

    很多次遇到python 3下的文件编码,解码问题,我这里的平台是mac,下面吐血搞一波.. 1. ASCII编码: 字符串是一种数据类型,但是,字符串比较特殊的是还有一个编码问题.因为计算机只能处理数 ...

  8. python模块之email: 电子邮件编码解码 (一、解码邮件)

    https://yq.aliyun.com/articles/54621 python模块之email: 电子邮件编码解码 (一.解码邮件) python自带的email模块是个很有意思的东西,它可以 ...

  9. RPC 技术及其框架 Sekiro 在爬虫逆向中的应用,加密数据一把梭

    文章目录 什么是 RPC JSRPC Sekiro 优缺点 什么是 RPC RPC,英文 RangPaCong,中文让爬虫,旨在为爬虫开路,秒杀一切,让爬虫畅通无阻! 开个玩笑,实际上 RPC 为远程 ...

最新文章

  1. 文本相似度计算(一)
  2. The 16th Zhejiang Provincial Collegiate Programming Contest Sponsored by TuSimple
  3. word打开文档很久很慢_word文档打开特别慢怎么解决,word10打开文档很慢
  4. 12.20今日头条实习面试总结-算法工程师
  5. AIX配置Volumn
  6. 为节省8亿做迁移,13亿记录出错赔偿29亿
  7. 关键2招提升软件开发项目的利润
  8. matlab 工具函数 —— normalize(归一化数据)
  9. jsoup抓取html中的js,使用Jsoup,抓取整个网站(包括图片、js、css)
  10. JSP 中 forward 转发 和 sendRedirect 重定向的区别
  11. SPSS教程—如何安装加权kappa计算插件
  12. 经典莱斯康混响插件LX480 Complete限时43%OFF
  13. PPT文件怎么转换成图片
  14. c语言程序设计第07章在线测,《C语言程序设计》第07章在线测试.doc
  15. JAVA毕设项目社区电商平台系统(java+VUE+Mybatis+Maven+Mysql)
  16. AI走向“战争技术”,是减少损伤还是推向灾难
  17. 如何用十六进制换算十进制
  18. C语言初学者需要知道的十句话,听说不知道的人都没学好编程
  19. 根据某一字段值相同合并字符串
  20. 设计师2022面试UI作品集PSD样机模板

热门文章

  1. Opencv(C++)笔记--Sobel算子和laplacian算子
  2. RFID-aloha算法
  3. 前端高频面试题-HTML和CSS篇(一)
  4. 西南交通大学计算机学院转专业吗,西南交通大学可以转专业吗,西南交通大学新生转专业政策...
  5. 有三个正整数a,b,c(0a,b,c10^6),其中c不等于b。若a和c的最大公约数为b,现已知a和b,求满足条件的最小的c。
  6. Console 相关操作
  7. Ansible 自动化运维
  8. 非正交多址接入(NOMA)
  9. PHP设计模式之委托模式(Delegation)了解下
  10. 手机闪付是什么意思_银联联合发布,新的手机闪付:产品已经到来