Fork me on GitHub

Bugku-CTF逆向篇之入门逆向

入门逆向

 
 
本题要点:ASCII编码、IDA中main函数查看、OD的单步运行操作
 
 
 
 
解压后发现是一个 .exe 文件
 
先用 Exeinfo PE  查看一下是否加壳
 
 
可以看到写了gcc编译的。应该是没有加壳的。
 

 
简要补充一点~
 
 笔者是个初学者,所知有限,难免会有错误,如果有小伙伴发现了错误,还请指正~ 
 
   1.壳的概念 
 
    在计算机软件里有一段专门负责保护软件不被非法修改或反编译的程序。它们一般都是先于程序运行,拿到控制权,然后完成它们保护软件的任务。
 
   2.加壳的概念 
 
    通过数学运算,将可执行程序文件或动态链接库文件的编码进行改变, 以达到缩小文件体积或加密程序编码的目的。
 
    例如:黑客使用病毒加壳,主要是对使用的木马等恶意程序进行保护,从而避免它们被杀毒软件查杀; 程序作者想对程序资源压缩、注册保护的目的,在计算机软件里也有一段专门负责保护软件不被非法修改或反编译的壳; 有一些版权信息需要保护起来,不想让别人随便改动,如作者的姓名,即为了保护软件不被破解,通常都是采用加壳来进行保护......
 
    常见的壳有压缩壳、密码壳、加密壳。
 
   3.脱壳的概念 
 
    对应加壳的概念来说,是指除掉程序的保护(壳),修改程序资源。
 
    脱壳的两种方法: 硬脱壳和动态脱壳
 
    (1) 硬脱壳。这是指找出加壳软件的加壳算法,写出逆向算法,就像压缩和解压缩一样。
 
    (2) 动态脱壳。由于加壳的程序运行时必须还原成原始形态,即加壳程序会在运行时自行脱壳, 抓取(Dump)内存中的镜像,再重构成标准的执行文件。
 

 
 
我们先拖入  IDA   中,定位  main 函数 ,发现有许多  mov 指令 ,66H 是  f  ,6CH 是   l  ,推测这就是 flag 的  ASCII 码值 。
 
 
鼠标点击 66H ,按键盘 R键 ,就可以显示出字符得到 flag。
 
 
 
 
当然,我们也可以用 OD 进行 动态调试 ,单步运行看看栈里的变化。
 
从IDA中先搜索  0x00401475  这个地址。
 
 
 
在 OD 中, Ctrl+G ,搜索地址,找到指令之后按  F2  下断点。
 
 
 
 
 
flag 值是从  ESP+0x2F  开始,可以用计算器算一下,ESP 是  0x61FEF0 ,加 0x2F 就是  0x61FF1F ,按照这个地址去栈中看。
 
 
在栈这个窗口,右键=》显示ASCII数据
 
 
前面我们说到0x61FF1F这个地址,但是我们单步运行后,自动跳转之后发现没有0x61FF1F这个地址,最近的就是 0x61FF1C ,(此处笔者也不知道是为什么,有大佬可以指点一下~)那我们就看一下0x61FF1C吧~
 
 
 
 补充: 
 
 
 
我们单步执行了三步,看到输出了 lf ,再单步执行一步, mov 了一个 61 进去也就是  a  ,然后往里面输a进去,应该是大小端的问题,所以是往前打印的,也就是往前站了一个字节a,所以是 alf ,往后类推.......
 

 
 
虽然   L   后面是一个中文,但是看 ASCII 码的话他是 0x7D,也就是  } ,只不过跟后面的 0xBB 放在一起,OD就翻译成一个中文了
 
得到答案:  flag{Re_1s_S0_C0OL} 
 
 
 
 
 
参考资料:
 
http://bhhacker.lofter.com/post/38b021_6899f31
https://blog.csdn.net/thmail/article/details/72781649
https://blog.csdn.net/Selukwe/article/details/88429093
 
 
 
posted @ 2020-05-21 21:21  0yst3r  阅读(3674)  评论(6编辑  收藏  举报
返回顶部