python在逆向中的应用——解码得到flag
逆向: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文件中,使用其替换功能处理数据。
- 先去除空格(将空格替换为空)
- 将v换成’v
- 将=换成’:
这样,不就得出了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相关推荐
- python读文件的解码方式_跳过Python文件读取中的不可解码字符
我有一个csv文件,我想用Python读取它.当我使用下面的代码片段时,我得到一个错误.在with open(input_file, 'r') as file: self.md = file.read ...
- 如何解决python中编码错误的问题_【总结】Python 2.x中常见字符编码和解码方面的错误及其解决办法...
该楼层疑似违规已被系统折叠 隐藏此楼查看此楼 对于Python解析器 而Python解析器所干的事情,就是: Python解析器,根据当前的所用的字符串编码类型 此字符串编码类型,是你自己所设置的 不 ...
- python2发送http不编码_[转]Python 2.x中常见字符编码和解码方面的错误及其解决办法...
Python 2.x中的字符编码,设计的的确不好,导致初学者,甚至是即使用Python很长时间的人,都会经常遇到字符编解码方面的错误. 下面就把一些常见情,尽量的都整理出来,并给出相应的解决办法. 看 ...
- 【2021.12.25】ctf逆向中常见加密算法和编码识别
[2021.12.25]ctf逆向中常见加密算法和编码识别(含exe及wp) 文章目录 [2021.12.25]ctf逆向中常见加密算法和编码识别(含exe及wp) 0.前言 1.基础加密手法 2.b ...
- python 中文转unicode编码_Python 解码 Unicode 转义字符串
其实,这里要讨论的内容是针对 Python2 的,实际上也是 Python2 中让人头疼的编码问题,而 Python3 则好处理得多. 先来看看例子: >>> s = "我 ...
- python字符集_PYTHON 中的字符集
Python中的字符编码是个老生常谈的话题,今天来梳理一下相关知识,希望给其他人些许帮助. Python2的 默认编码 是ASCII,不能识别中文字符,需要显式指定字符编码:Python3的 默认编码 ...
- 详解python 3下文本文件的编解码
很多次遇到python 3下的文件编码,解码问题,我这里的平台是mac,下面吐血搞一波.. 1. ASCII编码: 字符串是一种数据类型,但是,字符串比较特殊的是还有一个编码问题.因为计算机只能处理数 ...
- python模块之email: 电子邮件编码解码 (一、解码邮件)
https://yq.aliyun.com/articles/54621 python模块之email: 电子邮件编码解码 (一.解码邮件) python自带的email模块是个很有意思的东西,它可以 ...
- RPC 技术及其框架 Sekiro 在爬虫逆向中的应用,加密数据一把梭
文章目录 什么是 RPC JSRPC Sekiro 优缺点 什么是 RPC RPC,英文 RangPaCong,中文让爬虫,旨在为爬虫开路,秒杀一切,让爬虫畅通无阻! 开个玩笑,实际上 RPC 为远程 ...
最新文章
- 文本相似度计算(一)
- The 16th Zhejiang Provincial Collegiate Programming Contest Sponsored by TuSimple
- word打开文档很久很慢_word文档打开特别慢怎么解决,word10打开文档很慢
- 12.20今日头条实习面试总结-算法工程师
- AIX配置Volumn
- 为节省8亿做迁移,13亿记录出错赔偿29亿
- 关键2招提升软件开发项目的利润
- matlab 工具函数 —— normalize(归一化数据)
- jsoup抓取html中的js,使用Jsoup,抓取整个网站(包括图片、js、css)
- JSP 中 forward 转发 和 sendRedirect 重定向的区别
- SPSS教程—如何安装加权kappa计算插件
- 经典莱斯康混响插件LX480 Complete限时43%OFF
- PPT文件怎么转换成图片
- c语言程序设计第07章在线测,《C语言程序设计》第07章在线测试.doc
- JAVA毕设项目社区电商平台系统(java+VUE+Mybatis+Maven+Mysql)
- AI走向“战争技术”,是减少损伤还是推向灾难
- 如何用十六进制换算十进制
- C语言初学者需要知道的十句话,听说不知道的人都没学好编程
- 根据某一字段值相同合并字符串
- 设计师2022面试UI作品集PSD样机模板
热门文章
- Opencv(C++)笔记--Sobel算子和laplacian算子
- RFID-aloha算法
- 前端高频面试题-HTML和CSS篇(一)
- 西南交通大学计算机学院转专业吗,西南交通大学可以转专业吗,西南交通大学新生转专业政策...
- 有三个正整数a,b,c(0a,b,c10^6),其中c不等于b。若a和c的最大公约数为b,现已知a和b,求满足条件的最小的c。
- Console 相关操作
- Ansible 自动化运维
- 非正交多址接入(NOMA)
- PHP设计模式之委托模式(Delegation)了解下
- 手机闪付是什么意思_银联联合发布,新的手机闪付:产品已经到来