SHCTF-2017:crackme
时间:2019-06-17
本文章向大家介绍SHCTF-2017:crackme,主要包括SHCTF-2017:crackme使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。
下载附件,附件为exe的可执行文件,第一步查壳。
发现为nsPack壳,可采用脱壳机或者手动脱壳的方式进行脱壳。
在此采用手动脱壳的方式,增加自己对脱壳流程的理解,并熟练相关操作。
将程序拖入OD
发现pushfd和pushad两句关键句。
F8单步执行到call语句,ESP变化,在ESP上右键,添加断点。
F9执行程序
执行到popfd,且下一条命令为一个很长距离的跳转。
F8单步执行到如下位置
00401336 为程序的OEP
利用PETools获取转存
利用 ImportREC 修复
脱壳后的程序能够正确运行
对脱壳后的程序进行查壳
查询结果壳已经脱掉,脱壳操作完毕。
将程序拖入IDA分析
int __cdecl main(int argc, const char **argv, const char **envp) { int result; // eax int v4; // eax char Buf; // [esp+4h] [ebp-38h] char Dst; // [esp+5h] [ebp-37h] Buf = 0; memset(&Dst, 0, 0x31u); printf("Please Input Flag:"); gets_s(&Buf, 0x2Cu); if ( strlen(&Buf) == 42 ) { v4 = 0; while ( (*(&Buf + v4) ^ byte_402130[v4 % 16]) == dword_402150[v4] ) { if ( ++v4 >= 42 ) { printf("right!\n"); goto LABEL_8; } } printf("error!\n"); LABEL_8: result = 0; } else { printf("error!\n"); result = -1; } return result; }
在while语句中,对输入字符串进行异或运算,利用异或运算特殊的可逆性。将byte_402130与dword_402150进行异或,即可得到正确答案。
byte_402130处需要模16 循环取值。
编写python脚本
string_1 = "this_is_not_flag" string_2 = [0x12, 4, 8, 0x14, 0x24, 0x5c, 0x4a, 0x3d, 0x56, 0xa, 0x10, 0x67, 0, 0x41, 0, 1, 0x46, 0x5a, 0x44, 0x42, 0x6e, 0x0c, 0x44, 0x72, 0x0c, 0x0d, 0x40, 0x3e, 0x4b, 0x5f, 2, 1, 0x4c, 0x5e, 0x5b, 0x17, 0x6e, 0xc, 0x16, 0x68, 0x5b, 0x12, 0x48, 0x0e] flag = "" for i in range(42): flag += chr(string_2[i] ^ ord(string_1[i % 16])) print(flag)
输出:flag{59b8ed8f-af22-11e7-bb4a-3cf862d1ee75}
解题完毕!
收获:熟悉手动脱壳操作,解题完毕后,在网上查找资料学习各种加壳的手动脱壳流程。
部分资料:https://www.bilibili.com/video/av9251496/
原文地址:https://www.cnblogs.com/MuZiShiYe/p/11041951.html
- MYSQL常用SQL汇总
- Linux 下设置SVN DIFF
- 剑指 offer代码解析——面试题38数字在排序数组中出现的次数
- 剑指 offer代码解析——面试题37两个链表的第一个公共结点
- 剑指 offer代码解析——面试题34丑数
- 剑指 offer代码解析——面试题35第一个只出现一次的字符
- Python内置数据结构之集合
- 剑指 offer代码解析——面试题32统计1到n中1出现的次数
- 剑指 offer代码解析——面试题26复杂链表的复制
- Linux软件安装(二)——RPM与YUM
- linux软件安装(一)——源码安装
- 利用LUA协程实现FUTURE模式
- Python内置数据结构之字典(完整版)
- Maven使用详解
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法