0 day 安全笔记 第一章 1.4 crack 小实验

第一次发文,不知道会不会触犯版规,如有错误欢迎告知,谢谢。

OS:XP SP3
编译器: DEV C++ 4.9.9.2

工具:
OD (ollydbg)
IDA
CFF Explorer

猜密码程序: 正确密码1234567 猜到对为止

#include <stdio.h>
#define PASSWORD "1234567"
int verify_password (char *password)
{
	int authenticated;
	authenticated=strcmp(password,PASSWORD);
	return authenticated;
}

main()
{
	int valid_flag=0;
	char password[1024];
	while(1)
	{
		printf("please input password:       ");
		scanf("%s",password);
		valid_flag = verify_password(password);
		if(valid_flag)
		{
			printf("incorrect password!\n\n");
		}
		else
		{
			printf("Congratulation! You have passed the verification!\n");
			break;
		}
	}
}

实验目的:

1.定位关键跳转,并且爆破
2.爆破後修改PE档

废话不多说来个IDA:

(IDA可以还原出代码跟流程图,但是有时候代码会跟其他反组译工具不一样,但逻辑是差不多的)

img

可以看见 cmp 比较完,然後跳转指令 jz,接下去有两条分支
一条跳转到 401332,接下去会congratulation....
另一条直接走向 incorrect password....

直接OD 观察关键跳转

img

可以发现 cmp 比较完,然後跳转指令 je 这就是刚刚说的两个指令不一样。(但逻辑是一样的)

研究一下cmp 跟 je 与 jz

1.假设 cmp 123,123 (左)-(右) /// 123-123 = 0 当结果是0的时候 , ZF标志位=1

2.JZ,JE
这两个指令是一个意思,通过ZF标志位是否跳转,当执行到JZ或者JE指令时,如果ZF=1则跳转,如果ZF=0,不跳转

好玩的来了
正确输入会是 cmp 1234567,1234567 /// 1234567-1234567=0 当结果是0的时候 , ZF标志位=1

我们要挑战错误的密码,也能成功!!!

把je 改成 jne或是 jnz

JNE,JNZ
这两条语句同一个意思,只是叫法不同,当执行到这两条语句时,如果标志位ZF=0,则跳转

也就是说我们输入778899
当 cmp 1234567,778899 /// 1234567-778899 不会是 0 ,所以ZF会被设0

所以 jne 或是 jnz 就会跳瞜!!!

用OD 在那个位址点两下可以修改

img

修改完上下对比一下 指令

正常的 JE 的指令对应 opcode 是 74 0E
修改後 JNZ 的指令对应 opcode 是 75 0E

只需要修改 1 byte

修该 PE 档

这次我们先用难度较高的手动修该 PE档 了解一下PE结构
(关於PE 不深入讨论 网路上有很多文章)

简单来说

exe档 其实是 pe 格式。

PE 格式的结构,定义了一只程序在虚拟内存中的结构
(因为Windows是虚拟一个4GB的内存给每一个进程 可能实际上你的主机只有512MB 盖兹牛逼!)
所以在小小的PE结构中,定义了如何放大并映射到4GB虚拟内存。
所以了解PE结构 很重要!!!

CFF Explorer 打开 exe

img

imageBase 00400000 就是虚拟的基地址
也就是说PE结构,现在从虚拟地址00400000开始

img

接下来我们只关注 .text的 Section 这是存放代码的地方

Raw address 0x400 代表 PE文件中的代码段(.text)在相对PE文件 0x400的位置

Virtual Address 0x1000 代表 PE代码段(.text) 映射到 虚拟的基地址(0x00400000)+ 0x1000 = 0x00401000

把OD 拉到最上面确实 代码从 0x00401000 开始

img

我们想要修改 虚拟地址 00401322中的 opcode 74 换成 75

img

如何从虚拟位置 00401322 反推回去真实的PE结构位置

img

imageBase:0x00400000

虚拟的 .text Virtual Address 在 imageBase + 0x1000 位置上

PE的 .text真实位置是在距离 PE 文件 0x400的位置上

1.那很简单,先算出第一个代码(00401000) 跟 00401322的距离:

00401322- (00400000+00001000) = 322

2.真实的 PE.text 在 0x400
0x400 + 0x322 = 0x722

验证一下

img

修改成 75 并保存

img
img

用CMD开起 exe确认

img

成功了。

学会手动修改PE 那我们接下来直接用工具修改并且恢复

img

img

img

img

img

img

我们把东西爆破了 又复原了!!!

img

如果喜欢这方面的知识也欢迎交流。


<<:  Thunkable学习笔记 5 - 使用者登入记录(Realtime Database读取与写入)

>>:  [MIT-6.S081-2020] OS课程----Xv6作业系统的环境架设

学习MLOps前暖身操:why, what, who?

接下来的30天,我们会一起看MLOps的更多层面。从为什麽产业开始谈MLOps开始,以及其包含的技术...

[C 语言笔记--Day09] 解题纪录:Moamen and k-subarrays

https://codeforces.com/contest/1557/problem/B 程序码:...

[Golang] Introduction to Variables

Decaliring Variables Let's update the hello.go exa...

30-17 之 DataSource Layer - Active Record

接下来要这篇文章要来谈谈很常听到的『 Active Record 』。 什麽是 Active Rec...

[Day 23] Facial Landmark

人脸关键点 (Facial Landmark)是找出人脸上五官的位置 而目前在应用上人脸关键点几乎都...