一个涉及到浮点寄存器的CM
这次找小伙伴要了他的一个CM,怎么说呢,这CM让我学到了不少,其实搞出来后感觉不难,就是有不少FPU浮点相关的指令和FPU寄存器完全没学过,查了不少资料,学到了很多
打开是这样
无壳程序,我们直接od查找字符串,爆破我就不说了,直接改跳转
我第一次是找到这个判断的函数开头,一行行快速单步,确实发现了输入,但是后来很多命令不懂意思我也单步,导致看到后来也不知道怎么判断的
然后我改了策略,先逆着就近看看,怎么才能使条件成立
004010EA |. F6C4 41 test ah,0x41 ; zf=0 -> ah & 0x41 != 0
004010ED |. B8 00000000 mov eax,0x0
004010F2 |. 0f95c0 setne al ; eax=1 -> al=1 -> zf=0
004010F5 |. 8945 D0 mov [local.12],eax
004010F8 |. 837D D0 01 cmp [local.12],0x1
004010FC |. 0F85 39000000 jnz 测试.0040113B ; 要求zf=1,即eax=0x1
00401102 |. BB 06000000 mov ebx,0x6
00401107 |. E8 F8FEFFFF call 测试.00401004
0040110C |. 68 01030080 push 0x80000301
00401111 |. 6A 00 push 0x0
00401113 |. 68 00000000 push 0x0
00401118 |. 68 04000080 push 0x80000004
0040111D |. 6A 00 push 0x0
0040111F |. 68 6D1B4800 push 测试.00481B6D ; 成功
00401124 |. 68 04000000 push 0x4
00401129 |. BB 90164000 mov ebx,测试.00401690
0040112E |. E8 36010000 call 测试.00401269
00401133 |. 83C4 34 add esp,0x34
00401136 |. E9 34000000 jmp 测试.0040116F
0040113B |> BB 06000000 mov ebx,0x6
00401140 |. E8 BFFEFFFF call 测试.00401004
00401145 |. 68 01030080 push 0x80000301
0040114A |. 6A 00 push 0x0
0040114C |. 68 00000000 push 0x0
00401151 |. 68 04000080 push 0x80000004
00401156 |. 6A 00 push 0x0
00401158 |. 68 721B4800 push 测试.00481B72 ; 失败
0040115D |. 68 04000000 push 0x4
也就是说需要找ah相关的
接下来我们整体看看,因为第一次接触FPU浮点相关的指令和FPU寄存器,所以注释写的比较繁琐,望大家见谅
0040100C /. 55 push ebp
0040100D |. 8BEC mov ebp,esp
0040100F |. 81EC 34000000 sub esp,0x34
00401015 |. 6A FF push -0x1
00401017 |. 6A 08 push 0x8
00401019 |. 68 02000116 push 0x16010002
0040101E |. 68 01000152 push 0x52010001
00401023 |. E8 47020000 call 测试.0040126F ; 执行后 输入的密码 -> eax(1886b8)
00401028 |. 83C4 10 add esp,0x10
0040102B |. 8945 FC mov [local.1],eax ; eax中你的输入 -> ebp-4
0040102E |. 68 04000080 push 0x80000004
00401033 |. 6A 00 push 0x0
00401035 |. 8B45 FC mov eax,[local.1]
00401038 |. 85C0 test eax,eax
0040103A |. 75 05 jnz short 测试.00401041
0040103C |. B8 5C1B4800 mov eax,测试.00481B5C
00401041 |> 50 push eax
00401042 |. 68 01000000 push 0x1
00401047 |. BB A0134000 mov ebx,测试.004013A0
0040104C |. E8 18020000 call 测试.00401269 ; eax=16进制(你的输入) ecx=0
00401051 |. 83C4 10 add esp,0x10 ; esp = 1000b
00401054 |. 8945 F8 mov [local.2],eax ; 16进制(你的输入) -> local.2
00401057 |. 8B5D FC mov ebx,[local.1] ; 你的输入 -> ebx
0040105A |. 85DB test ebx,ebx
0040105C |. 74 09 je short 测试.00401067
0040105E |. 53 push ebx ; 输入压栈 ebp-38 local.14
0040105F |. E8 F9010000 call 测试.0040125D
00401064 |. 83C4 04 add esp,0x4 ; [ebp-38] + 4
00401067 |> DB45 F8 fild [local.2] ; 十进制浮点(输入) -> st0
0040106A |. DD5D F0 fstp qword ptr ss:[ebp-0x10] ; st0 -> ebp-10H
0040106D |. DD45 F0 fld qword ptr ss:[ebp-0x10] ; ebp-10 -> st0
00401070 |. DC05 5D1B4800 fadd qword ptr ds:[0x481B5D] ; st0 = st0 + 520
00401076 |. DD5D E8 fstp qword ptr ss:[ebp-0x18] ; 十进制你的输入+520 -> ebp-18H
00401079 |. 6A FF push -0x1
0040107B |. 6A 08 push 0x8
0040107D |. 68 03000116 push 0x16010003
00401082 |. 68 01000152 push 0x52010001
00401087 |. E8 E3010000 call 测试.0040126F
0040108C |. 83C4 10 add esp,0x10
0040108F |. 8945 E4 mov [local.7],eax
00401092 |. 68 04000080 push 0x80000004
00401097 |. 6A 00 push 0x0
00401099 |. 8B45 E4 mov eax,[local.7]
0040109C |. 85C0 test eax,eax
0040109E |. 75 05 jnz short 测试.004010A5
004010A0 |. B8 5C1B4800 mov eax,测试.00481B5C
004010A5 |> 50 push eax
004010A6 |. 68 01000000 push 0x1
004010AB |. BB A0134000 mov ebx,测试.004013A0
004010B0 |. E8 B4010000 call 测试.00401269
004010B5 |. 83C4 10 add esp,0x10
004010B8 |. 8945 E0 mov [local.8],eax
004010BB |. 8B5D E4 mov ebx,[local.7]
004010BE |. 85DB test ebx,ebx
004010C0 |. 74 09 je short 测试.004010CB
004010C2 |. 53 push ebx
004010C3 |. E8 95010000 call 测试.0040125D
004010C8 |. 83C4 04 add esp,0x4
004010CB |> DB45 E0 fild [local.8] ; (641)10 -> st0
004010CE |. DD5D D8 fstp qword ptr ss:[ebp-0x28] ; st0 -> ebp-28H
004010D1 |. DD45 E8 fld qword ptr ss:[ebp-0x18] ; [ebp-18H](十进制你的输入+520) -> st0
004010D4 |. DC65 D8 fsub qword ptr ss:[ebp-0x28] ; st0 = st0 - [ebp-28H] (641)10
004010D7 |. D9E4 ftst ; st0和0.0比较,据此设置FPU状态字C0,C2,C3位
004010D9 |. DFE0 fstsw ax
004010DB |. F6C4 01 test ah,0x1
004010DE |. 74 02 je short 测试.004010E2
004010E0 |. D9E0 fchs ; st0改变符号位
004010E2 |> DC1D 651B4800 fcomp qword ptr ds:[0x481B65] ; st0和[481B65](无限接近0的一个正浮点数)比较,据此设置FPU状态字C0,C2,C3位,并把st0弹到[481B65]
004010E8 |. DFE0 fstsw ax ; FPU状态字 -> eax,根据下面可知,FPU状态字C0或C3为1均可
004010EA |. F6C4 41 test ah,0x41 ; zf=0 -> ah & 0x41 != 0
004010ED |. B8 00000000 mov eax,0x0
004010F2 |. 0f95c0 setne al ; eax=1 -> al=1 -> zf=0
004010F5 |. 8945 D0 mov [local.12],eax
004010F8 |. 837D D0 01 cmp [local.12],0x1
004010FC |. 0F85 39000000 jnz 测试.0040113B ; 要求zf=1,即eax=0x1
00401102 |. BB 06000000 mov ebx,0x6
00401107 |. E8 F8FEFFFF call 测试.00401004
0040110C |. 68 01030080 push 0x80000301
00401111 |. 6A 00 push 0x0
00401113 |. 68 00000000 push 0x0
00401118 |. 68 04000080 push 0x80000004
0040111D |. 6A 00 push 0x0
0040111F |. 68 6D1B4800 push 测试.00481B6D ; 成功
00401124 |. 68 04000000 push 0x4
00401129 |. BB 90164000 mov ebx,测试.00401690
0040112E |. E8 36010000 call 测试.00401269
00401133 |. 83C4 34 add esp,0x34
00401136 |. E9 34000000 jmp 测试.0040116F
0040113B |> BB 06000000 mov ebx,0x6
00401140 |. E8 BFFEFFFF call 测试.00401004
00401145 |. 68 01030080 push 0x80000301
0040114A |. 6A 00 push 0x0
0040114C |. 68 00000000 push 0x0
00401151 |. 68 04000080 push 0x80000004
00401156 |. 6A 00 push 0x0
00401158 |. 68 721B4800 push 测试.00481B72 ; 失败
0040115D |. 68 04000000 push 0x4
那么回到上面的问题,ah的值是从哪来的,我们在004010E8
处可以看到,FPU状态码进了eax
那么根据我们的判断ah & 0x41 != 0
,能得出对FPU状态字有什么要求呢?
我们看这张图
也就是说
0100 0001
& -x-- -yzt
----------------
真
其中x代表C3,y代表C2,z代表C1,t代表C0
根据上面的判断,也就是说只能C3或C0为1
- C3为1的话
004010E2 |> DC1D 651B4800 fcomp qword ptr ds:[0x481B65] ; st0和[481B65](无限接近0的一个正浮点数)比较,据此设置FPU状态字C0,C2,C3位,并把st0弹到[481B65]
这段就是st0等于一个无限接近0的浮点数才能使C3为1,但是根据我们之前的st0 = st0 = 你的输入+520-641
,st0不可能是等于一个无限接近0的浮点数,所以C3为1排除 fcomp命令参考处
- C0为1的话
C0为1是怎么来的呢?只有两个地方涉及到了FPU状态字的改变,分别是4010D7
和4010E2
4010E2
处要使C0为1,必须st0小于那个无限接近0的浮点数,这个条件不足以我们判断,接着往上看
4010D7
处要使C0为1,必须st0等于0.0,也就是你的输入+520-641=0
ftst命令参考处
所以至此我们就得到了密码
密码+520-641=0 ==> 密码=121
这个CM怎么说呢,我刚开始是没想到会涉及到浮点寄存器的,因为我还没学这个,不过后来追到快判断的地方时,发现了FPU状态码进入eax参与过程了,然后查了关于FPU 状态寄存器的资料,就可以搞出来了
一个涉及到浮点寄存器的CM的更多相关文章
- C语言:一个涉及指针函数返回值与printf乱码、内存堆栈的经典案例
一个奇怪的C语言问题,涉及到指针.数组.堆栈.以及printf.以下实现: 整数向字符串的转换,返回字符串指针,并在main函数中调用printf显示. #include<stdio.h> ...
- [zt]系统中常用MIPS指令
指令 功能 应用实例 LB 从存储器中读取一个字节的数据到寄存器中 LB R1, 0(R2) LH 从存储器中读取半个字的数据到寄存器中 LH R1, 0(R2) LW 从存储器中读取一个字的数据到寄 ...
- [转] RISC-V架构介绍
1. RISC-V和其他开放架构有何不同 如果仅从"免费"或"开放"这两点来评判,RISC-V架构并不是第一个做到免费或开放的处理器架构. 在开始之前,我们先通 ...
- 关于RiscV的一些资料整理
1. 基于RISC-V架构的开源处理器及SoC研究综述 https://mp.weixin.qq.com/s/qSD-q8y0_MY8R0MBA85ZZg 原文链接: https://blog.csd ...
- RISCV 入门 (学习笔记)
文章目录 1. risv 相关背景 1.1 arm 授权费 1.2 riscv 发展历史 1.3 riscv 风险 2. 指令集 2.1 可配置的通用寄存器组 2.2 规整的指令编码 2.3 简洁的存 ...
- 汇编 浮点指令FLD,FSTP,FADD与FPU寄存器
知识点: 浮点数的存放方式 st0至st7 FLD,FST,FADD指令 一.浮点数的存放方式 00401000 /$ 55 PUSH EBP 00401001 |. 8BEC MOV E ...
- x86寄存器总结
X86寄存器 ·x86寄存器分类: 8个通用寄存器:EAX.EBX.ECX.EDX.ESI.EDI.ESP.EBP 1个标志寄存器:EFLAGS 6个段寄存器:CS.DS.ES.FS.GS.SS 5个 ...
- 汇编,浮点运算符,fldpi,fmul等指令说明.
协处理器指令系统 协处理器共有68条不同的指令,汇编程序在遇到协处理器指令助记符时,都会将其转换成机器语言的ESC指令,ESC指令代表了协处理器的操作码. 协处理器指令在执行过程中,需要访问内存单元时 ...
- X86-64寄存器和栈帧
简介 通用寄存器可用于传送和暂存数据,也可参与算术逻辑运算,并保存运算结果.除此之外,它们还各自具有一些特殊功能.通用寄存器的长度取决于机器字长,汇编语言程序员必须熟悉每个寄存器的一般用途和特殊用途, ...
随机推荐
- java踩坑
1. java判断两个字符串是否相等用equals 2. java只传递指针遇到的坑: 1 import java.util.*; 2 3 public class mapTest { 4 publi ...
- Python: 字典dict: 相同点
问题:怎么样在两个字典中找相同点 answer: eg1: 下面2个字典 a={'x':1,'y':2,'z':3}, b={'w':10,'x':11,'y':2}, 1)找相同点: a.ke ...
- log4j日志输出使用_1
转自https://www.cnblogs.com/sky230/p/5759831.html Log4j是帮助开发人员进行日志输出管理的API类库.它最重要的特点就可以配置文件灵活的设置日志信息的优 ...
- 【Alpha版本】冲刺阶段——Day6
[Alpha版本]冲刺阶段--Day6 阅读目录 今日进展 问题困难 明日任务 今日贡献量 TODOlist [今日进展] 为注册模块增加界面代码 public static void Windows ...
- linux基础命令---显示进程ps
ps ps指令可以显示系统中当前进程的信息,它的输出结果是高度可定制的.如果您希望重复更新所选内容和显示的信息,请使用top(1)代替. 请注意,“ps-aux”与“ps aux”不同.POSIX和U ...
- DB2的空间数据库管理复杂配置
计算机条件: a机器:linux系统 安装arcgis server b机器:windows系统 安装catalog c机器:linux系统 安装DB2 ...
- httpclient get post
https://www.cnblogs.com/wutongin/p/7778996.html post请求方法和get请求方法 package com.xkeshi.paymentweb.contr ...
- bzoj2287 [POJ Challenge]消失之物
题目链接 少打个else 调半天QAQ 重点在47行,比较妙 #include<algorithm> #include<iostream> #include<cstdli ...
- [转载]web安全之token
参考:http://blog.csdn.net/sum_rain/article/details/37085771 Token,就是令牌,最大的特点就是随机性,不可预测.一般黑客或软件无法猜测出来. ...
- VMware激活密钥
VMware 2017 v14.x 永久许可证激活密钥FF31K-AHZD1-H8ETZ-8WWEZ-WUUVACV7T2-6WY5Q-48EWP-ZXY7X-QGUWD 原文链接