re之ida和OllyDbg的使用与代码分析
- Section1 两个逆向工具的作用:
- Section2 ida伪代码分析
- Section3 OllyDbg的基本操作
这里是ctf逆向小白学习之路的第一站
Section1 两个逆向工具的作用:
1:IDA pro7.0是完整版本 7.2只有64 f5可以查看源码,6.8 pro的有些文件grapf view不能分析,作用:静态调试,32位的程序用32位的ida分析
2:OllyDBG,作用:动态调试,只能调试32位的程序
Section2 ida伪代码分析
下面展示一些 内联代码片
。
unsigned __int64 Decry()
{ char v1; // [rsp+Fh] [rbp-51h]int v2; // [rsp+10h] [rbp-50h]int v3; // [rsp+14h] [rbp-4Ch]int i; // [rsp+18h] [rbp-48h]int v5; // [rsp+1Ch] [rbp-44h]char src[8]; // [rsp+20h] [rbp-40h]__int64 v7; // [rsp+28h] [rbp-38h]int v8; // [rsp+30h] [rbp-30h]__int64 v9; // [rsp+40h] [rbp-20h]__int64 v10; // [rsp+48h] [rbp-18h]int v11; // [rsp+50h] [rbp-10h]unsigned __int64 v12; // [rsp+58h] [rbp-8h]v12 = __readfsqword(0x28u);*(_QWORD *)src = 357761762382LL;v7 = '\0';v8 = 0;v9 = 512969957736LL;v10 = '\0';v11 = 0;text = (char *)join(key3, &v9);strcpy(key, key1);strcat(key, src);v2 = 0;v3 = 0;getchar();v5 = strlen(key);for ( i = 0; i < v5; ++i ){if ( key[v3 % v5] > '@' && key[v3 % v5] <= 'Z' )key[i] = key[v3 % v5] + 32;++v3;}printf("Please input your flag:");while ( 1 ){v1 = getchar();if ( v1 == '\n' )break; 输入回车程序终止if ( v1 == ' ' ){++v2;}else{if ( v1 <= 96 || v1 > 122 ){if ( v1 > 64 && v1 <= 90 )str2[v2] = (v1 - 39 - key[v3++ % v5] + 97) % 26 + 97;}else{str2[v2] = (v1 - 39 - key[v3++ % v5] + 97) % 26 + 97;}if ( !(v3 % v5) )putchar(' ');++v2;}}if ( !strcmp(text, str2)puts("Congratulation!\n");elseputs("Try again!\n");return __readfsqword(0x28u) ^ v12;
}
//u:usigned
//_QWORD:Bit,Byte,Word,Dword,Qword. 8个比特(Bit)=一个字节(Byte),两个字节称为一个字(Word),两个字称为一个双字(Dword),两个双字称为一个四字(Qword)。
可以把_WORD理解为int,_Dword、 _QWORD理解为long int,这里src是一个强制类型转化为int类型的指针,char本质上也是int
//357761762382LL:涉及大小端序存储的问题
大端序(Big-endian):高位字节存入低地址,低位字节存入高地址;小端序(Little-endian):低位字节存入低地址,高位字节存入高地址,
这里可以看到两个十六进制是大端序,但是数据在内存中都是小端序,所以要将其反转一下。鼠标选中16进制按r键得到字符串,再反转为’NDCLS’和’hadow’
得到:
text= "killshadow"11个字符
key= "ADSFKNDCLS”11个字符
//Join:将key3和&v9两个字符串连接起来
逆向编写脚本:
思路1:
11次外循环:依次将正确的v1值存储至flag[]中
内循环:找到正确的v1值使得str2[v2]值与text中的一个字符能够比对相等,v1值可以用循环129次,ASCII码0-128依次试,因为输入的数在ASCII码是不确定的,所以倒推可以把所有的数都试一遍
思路2:
已知flag变换后要比对的字符串
用已知的字符串经过已知的变换式子倒推未知的变量
str[i]=(v1-39-key[i]+97)%26+97= text[i];
text[i]、key[i] 已知,反写式子求v1
总结:
1:大端序和小端序存储
2:Word,Dword,Qword数据类型
3:Join函数的作用
4:逆向编写脚本,
首先从最后一步比较是否相等的字符串倒推
Section3 OllyDbg的基本操作
背景知识:pe文件用OllyDbg打开后,首先看到的是EP (EntryPoint)入口点代码,是执行程序最先执行的代码,依赖于CPU,之后是编译器为保证程序正常运行自动添加的启动函数(不同编译器产生的启动函数都不同),而逆向分析首先是找到pe文件的main函数。
1、用OllyDbg寻找主函数
以hello word.exe为例
这里先了解一下hello word.exe(双击会出现一个box框显示“hello word!”)
main函数
方法一:代码执行法(只适用于代码量不大,功能明确的程序)
导入OD后,不断执行F8(单步步过,遇到call指令仅执行函数,不进入函数内部),当执行到main函数时,如果main函数功能是调用对话框显示信息,则在这一步程序会暂停,并执行mian函数功能,此时的地址就是main函数的地址,但如果main函数功能是比较两数的大小,那么f8会执行完整个程序,而不会在main函数处暂停
方法二:根据运行程序,程序给出的提示寻找main函数:
1)根据字符串找main函数
Cpu窗口右击查找-所有参考文本地段,双击即可进入cpu窗口对应字符串
2)查看被调用的api找main函数
推测main函数中使用的api—> 查看所有被调用的api(Cpu窗口右击查找-所有模块间的调用)—>双击进入函数
3)查看程序所有api找main函数(当程序被压缩保护后,OD就不能列出api调用列表了)
推测main函数中使用的api—>查看所有被加载的dll中的api(Cpu窗口右击查找-所有模块中的名称)—>定位到messagebox函数—>双击查看该函数的地址空间(我的理解是查看这个函数的具体实现方法)—>右侧寄存器窗口ESP的值即进程栈的地址,这里下一个断点,F9运行,程序停在了断点处,说明此处确实是mian函数的执行处—>查看栈窗口,看到call调用指令,说明0040100E处的指令调用了messagebox函数,go to(ctrl+g)跳转至0040100E,这里就是main函数的所在处
2、用OllyDbg修改pe文件(打补丁/破解)
以hello word.exe为例
1)直接修改字符串缓冲区(数据区的hex 数据窗口)
Go to跳转至4092a0,ctrl+e编辑,选中修改的ascii码右击复制到可执行文件,右击保存文件
2)在其他内存区新建字符串后,直接修改汇编码栏处被调用命令中的地址(在cpu窗口,将被传递给消息函数)
找到一个空闲的内存区,ctrl e编辑,修改cpu区push地址
懂得修改cpu窗口处的信息很重要,针对一些绕过,比如程序的功能是比较两个信息是否一样(用到JE命令:条件跳转指令,分为有条件跳转和无条件跳转),我们就可以修改JE命令为无条件跳转,就可以直接跳转到最后的结果了
3、总结:
1:跳转到某一地址处(go to):ctrl+g
2:编辑hex数据:ctrl+e
3:修改cpu区指令/地址:空格或直接双击
4:Push 00409FA0:将00409FA0地址处的数据压入栈,F8执行该命令后会发现ESP的值减小
//压栈和出栈与ESP寄存器(栈指针寄存器)有关,一个进程中,ESP初始状态指向栈底,push将数据压入栈,ESP上移,向低地址移动,pop将数据弹出栈,ESP下移,向高地址移动,栈为空,ESP指向栈底
re之ida和OllyDbg的使用与代码分析相关推荐
- 使用IDA PRO+OllyDbg+PEview 追踪windows API 动态链接库函数的调用过程
标 题: [原创]使用IDA PRO+OllyDbg+PEview 追踪windows API 动态链接库函数的调用过程. 作 者: shayi 时 间: 2015-02-12,05:19:54 链 ...
- 案例一: 使用IDA PRO+OllyDbg+PEview 追踪windows API 动态链接库函数的调用过程。 首先用文本编辑器写一个C++源程序名为StackFrame.cpp ,代码如下:
案例一: 使用IDA PRO+OllyDbg+PEview 追踪windows API 动态链接库函数的调用过程. 首先用文本编辑器写一个C++源程序名为StackFrame.cpp ,代码如下: 1 ...
- 恶意代码分析实战 6 OllyDbg
6.1 Lab 9-1 程序分析 首先,进行静态分析,使用strings. CreateFileA RegQueryValueExA RegOpenKeyExA RegSetValueExA RegC ...
- 恶意代码分析实战-通过IDA对恶意代码进行静态分析(Lab05-01.dll)
本文章为<恶意代码分析实战>的题目答案解析以及个人的一些理解,将通过一下问题对恶意代码Lab05-01.dll进行分析: D1lMain的地址是什么? 使用Imports窗口并浏览到get ...
- 初识Frida--Android逆向之Java层hook (一)
目录 0x00 文中用到的工具 0x01 hook示例的安装与分析 安装 源代码分析 0x02 frida自带的Messages机制与进程交互 0x03 Javascript代码构造与执行 方法一:获 ...
- python 的emulate函数封装_用模拟执行实现Objective-C代码自动化分析
火眼高级逆向工程实验室脚本系列:用模拟执行实现Objective-C代码自动化分析 写在前面的话 京东安全开源的 qiling 是一个很不错的想法,但是唯一的问题在于它实现的东西太多,比较笨重.有的时 ...
- PWN题型之Ret2Libc
文章目录 前言 0x1 :使用前提条件 0x2 :解题思路 0x3 :32位程序libc题型模板 0x4 :代码的解析 0x5 :64位程序实例 前言 菜鸡总结,如有不对,请不吝赐教. 0x1 :使用 ...
- 随想录(OllyDbg和IDA Pro的配合使用)
[ 声明:版权所有,欢迎转载,请勿用于商业用途. 联系信箱:feixiaoxing @163.com] 在软件处理中,OllyDbg和IDA Pro一般是配合使用的.前者主要用于动态的程序调试,后者 ...
- ret-sync插件:windbg/ollydbg+ida逆向调试神器
ida有不少主流调试器的扩展插件,如windbg/gdb等,可以在静态分析的基础上动态调试二进制文件.可是众多调试器扩展中没有兼顾ollydbg,难免觉得是一项缺憾. 最近在github上发现一个插件 ...
- IDA PRO 静态反汇编与OllyDbg动态调试实战技巧汇总
IDA PRO 静态反汇编与OllyDbg动态调试实战技巧汇总 ********************************** 案例一: 使用IDA PRO+OllyDbg+PEview 追踪w ...
最新文章
- 关于ubuntu的root密码问题
- c语言程序设计dowhile,(C语言while、dowhile、for循环课程5.docx
- win8系统软件不兼容怎么办
- 大数据学习笔记09:MapReduce概述
- php默认语法,PHP基本语法总结
- 第七篇 ScrollView控件
- es6的初级简易总结
- Linux之ping命令
- 使用VC2005一些问题及解决方案
- 白话Android音频系统原理
- CSS:使用媒体查询进行网页元素的缩放
- 卡方 matlab,用matlab算卡方值
- linux 卸载二进制包,Ubuntu19.10系统的软件安装与卸载命令
- oracle10g笔记1
- 硬件电路设计入门奉献系列(一)
- 软件工程 in MSRA 第一周博客作业
- 日语资料和电子版教材无偿分享
- @Validated和@Valid的使用
- bash入门脚本(未完善)
- JAVA大数据(二) Hadoop 分布式文件系统HDFS 架构,MapReduce介绍,Yarn资源调度
热门文章
- android 画图功能,Android实现简单画图画板
- 本命年第三季度阶段反思
- blender导入png图片不透明 | png贴图在blender中有黑底
- LIO-SAM_based_relocalization运行kitti回环序列并保存轨迹评估(一)——————源码的分析
- 尚德机构季报图解:净利达1.5亿 抗周期和盈利能力稳健
- 三种方式实现echarts树图的背景图片设置
- 读书笔记 ——《系统程序员成长计划》篇4:拥抱变化
- 【魔方代码】1200行C语言代码实现“魔方”程序,学会它买魔方的钱都省了,拿走不谢~
- 游戏支付接口平台如何选择
- Android:方向传感器