admin管理员组文章数量:1614997
简介
我在ctf比赛平台找到一个适合入门的题目,和这次中职比赛逆向的项目差不多,做题的套路都差不多,可以帮助大家快速入门简单的逆向有不会的可以加我qq来问我,需要这个小程序可以加我qq:3316735898,我会给你文件和工具
这次是简单的动态与静态调试,还会涉及到nop滑梯破解程序
动态调试
1.对靶机服务器场景桌面上的PE01.exe二进制文件进行静态调试,将main函数的入口地址作为Flag值提交;
由于题目叫我们是静态调试,但我还是想教大家一些动态调试的基础,将程序拖入Ollydbg
右击,选择中文搜索引擎,搜索ASCII
我们看到了flag,但是我们要找的是程序main函数的地址,双击第二排的”欢迎来到DUTCTF“
查看最顶部的地址,是0x0083000,可以看到在这个地址,程序执行的push操作,push在汇编语言里是压栈的操作,意思是开始载入函数了,所以main函数地址为:
0x0083000
第二题由于是找关键函数,这里还是用ida方便一点,这里就不演示ollydbg如何查看调用的函数名称
3. 对靶机服务器场景桌面上的PE01.exe二进制文件进行静态调试,找到Flag1值并提交;
右击,选择中文搜索引擎,搜索ASCII
第一排就是flag:
DUTCTF{We1c0met0DUTCTF}
4.对靶机服务器场景桌面上的PE01.exe二进制文件进行静态调试,尝试破解该二进制文件,将注册成功后的回显信息作为Flag值提交;
由于我们不知道程序叫我们输入什么(因为我用ida分析的程序,其实输入flag就会注册成功,然后回显消息,ida静态调试在下面),我们可以使用NOP覆盖,更改jmp地址,更改调用函数地址,更改正在执行test操作的eax寄存器的值等一系列破解操作,这里我们介绍NOP覆盖,什么是nop呢,Nop是无操作数,所以称为空操作,当我们nop掉jmp跳转操作时,这个跳转就失效了,我们可以继续向着我们目标前进
继续按f8,我们可以在输入flag处下一个断点,程序崩溃后,重新执行程序,可以按f9直接运行到断点处,这样更方便我们调试,断点快捷键为f2
断点意思就是让程序执行到此“停住”,不再往下执行
如何继续按下f8,发现按不动了,发现程序叫我们输入字符,我们随便输入几个字符,回车,然后又能继续执行了
继续按下f8,直到0x00883108F处,这里我们可以看到有一个跳转操作,因为我们输入错误了,我们将这个跳转操作nop掉
右击,选择二进制,nop填充
我们成功的nop掉了此地址的操作,然后我们继续按下f8,发现即使我们输入错误的值,也会显示成功注册的字符
flag get√
5.对靶机服务器场景桌面上的PE01.exe二进制文件进行静态调试,将该激活所需的许可证码作为Flag值提交;
看下面我分析的程序源码,其实就是输入的字符与flag做对比,如果一样就成功,所以该激活所需的许可证码为:
DUTCTF{We1c0met0DUTCTF}
静态调试
1.对靶机服务器场景桌面上的PE01.exe二进制文件进行静态调试,将main函数的入口地址作为Flag值提交;
将文件拖入ida pro
我们进入了ida,可以开始对程序开始静态分析,题目是(对靶机服务器场景桌面上的PE01.exe二进制文件进行静态调试,将main函数的入口地址作为Flag值提交;)
意思是我们只需要找到程序的main函数的入口即可
在ida左边的工作栏里,会显示程序和系统各种函数的入口地址,我们可以看到,这个程序main函数的入口地址为
0x00401000
2.对靶机服务器场景桌面上的PE01.exe二进制文件进行静态调试,将该二进制文件中检查许可证的关键函数作为Flag值提交;
在这个界面按下f5
ida会尽量帮我们还原程序的源代码,分析程序源代码可以发现,检查许可证的关键函为
strcmp
strcmp函数是比较两个字符串的大小,两个字符串相同时返回0,第一个字符串大于第二个字符串时返回一个正值,否则返回负值
对靶机服务器场景桌面上的PE01.exe二进制文件进行静态调试,找到Flag1值并提交;
对源代码开始分析:
int __cdecl main(int argc, const char **argv, const char **envp)
{
int v3; // eax
__int128 v5; // [esp+0h] [ebp-44h]
__int64 v6; // [esp+10h] [ebp-34h]
int v7; // [esp+18h] [ebp-2Ch]
__int16 v8; // [esp+1Ch] [ebp-28h]
char v9; // [esp+20h] [ebp-24h]
_mm_storeu_si128((__m128i *)&v5, _mm_loadu_si128((const __m128i *)&xmmword_413E34));
v7 = 0;
v6 = qword_413E44; #v6被赋予了一个变量,双击这个变量就可以查询到这个变量的16进制信息
v8 = 0;
printf("欢迎来到DUTCTF呦\n");
printf("这是一道很可爱很简单的逆向题呦\n");
printf("输入flag吧:");
scanf("%s", &v9); #将我们输入的字符串赋予v9
v3 = strcmp((const char *)&v5, &v9); #将我们输入的字符与v5做对比
if ( v3 )
v3 = -(v3 < 0) | 1;
if ( v3 )
printf(aFlag_0); #输出a_flag0自定义函数
else
printf((const char *)&unk_413E90);
system("pause");
return 0;
}
双击进入v6变量的地址,看他被赋予的什么值
这里有两个很长的16进制,这时,我们使用IDA的另一个功能 R,选中16进制字符串能够将十进制的数转换为字符串
flag就出来了,注:这里要跟大家普及一个知识了,及大端与小端
假设一个十六进制数0x12345678
大端的存储方式是:12,34,56,78,然后读取的时候也是从前往后读
小端的存储方式是:78,56,34,12,然后读取的时候是从后往前读取
所以,最后的flag应该是:
DUTCTF{We1c0met0DUTCTF}
4.对靶机服务器场景桌面上的PE01.exe二进制文件进行静态调试,尝试破解该二进制文件,将注册成功后的回显信息作为Flag值提交;
我们双击运行程序,输入我们的flag
回显信息为:
falg get√
5.对靶机服务器场景桌面上的PE01.exe二进制文件进行静态调试,将该激活所需的许可证码作为Flag值提交;
看我们之前分析程序源码,其实就是输入的字符与flag做对比,如果一样就成功,所以该激活所需的许可证码为:
DUTCTF{We1c0met0DUTCTF}
关注我,之后会发ctf逆向相关的入门教程
版权声明:本文标题:中职网络安全比赛逆向入门教程(2)\exe程序静态与动态分析,汇编nop覆盖 内容由热心网友自发贡献,该文观点仅代表作者本人, 转载请联系作者并注明出处:https://www.elefans.com/dongtai/1728693454a1169874.html, 本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容,一经查实,本站将立刻删除。
发表评论