第一次发文,不知道会不会触犯版规,如有错误欢迎告知,谢谢。
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可以还原出代码跟流程图,但是有时候代码会跟其他反组译工具不一样,但逻辑是差不多的)
可以看见 cmp 比较完,然後跳转指令 jz,接下去有两条分支
一条跳转到 401332,接下去会congratulation....
另一条直接走向 incorrect password....
可以发现 cmp 比较完,然後跳转指令 je 这就是刚刚说的两个指令不一样。(但逻辑是一样的)
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
JNE,JNZ
这两条语句同一个意思,只是叫法不同,当执行到这两条语句时,如果标志位ZF=0,则跳转
也就是说我们输入778899
当 cmp 1234567,778899 /// 1234567-778899 不会是 0 ,所以ZF会被设0
所以 jne 或是 jnz 就会跳瞜!!!
正常的 JE 的指令对应 opcode 是 74 0E
修改後 JNZ 的指令对应 opcode 是 75 0E
只需要修改 1 byte
这次我们先用难度较高的手动修该 PE档 了解一下PE结构
(关於PE 不深入讨论 网路上有很多文章)
exe档 其实是 pe 格式。
PE 格式的结构,定义了一只程序在虚拟内存中的结构
(因为Windows是虚拟一个4GB的内存给每一个进程 可能实际上你的主机只有512MB 盖兹牛逼!)
所以在小小的PE结构中,定义了如何放大并映射到4GB虚拟内存。
所以了解PE结构 很重要!!!
imageBase 00400000 就是虚拟的基地址
也就是说PE结构,现在从虚拟地址00400000开始
接下来我们只关注 .text的 Section 这是存放代码的地方
Raw address 0x400 代表 PE文件中的代码段(.text)在相对PE文件 0x400的位置
Virtual Address 0x1000 代表 PE代码段(.text) 映射到 虚拟的基地址(0x00400000)+ 0x1000 = 0x00401000
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
成功了。
如果喜欢这方面的知识也欢迎交流。
<<: Thunkable学习笔记 5 - 使用者登入记录(Realtime Database读取与写入)
>>: [MIT-6.S081-2020] OS课程----Xv6作业系统的环境架设
接下来的30天,我们会一起看MLOps的更多层面。从为什麽产业开始谈MLOps开始,以及其包含的技术...
https://codeforces.com/contest/1557/problem/B 程序码:...
Decaliring Variables Let's update the hello.go exa...
接下来要这篇文章要来谈谈很常听到的『 Active Record 』。 什麽是 Active Rec...
人脸关键点 (Facial Landmark)是找出人脸上五官的位置 而目前在应用上人脸关键点几乎都...