安全矩阵

 找回密码
 立即注册
搜索
查看: 1995|回复: 0

web选手如何快速卷入二进制世界

[复制链接]

221

主题

233

帖子

792

积分

高级会员

Rank: 4

积分
792
发表于 2021-6-25 08:36:25 | 显示全部楼层 |阅读模式
web选手如何快速卷入二进制世界原创 漂亮鼠 [url=]赛博回忆录[/url] 3天前
收录于话题
#代码审计3
#赛博回忆录4
#信息安全4
0x00 前言
大家好,最近产出有点少真是不好意思毕竟我太菜了,以后得加倍学习努力成为赛博卷王!
其实我是一个根本不懂技术的人,二进制我也是随便鼓捣的,大概能理解一些这样子。最近一直在试着挖皮卡丘,因为皮卡丘核心的东西都在二进制里,所以也不得不搞起了逆向。搞了段时间有点心得了想分享一下我的一些想法。简单的说,我目前认为,抛开复杂的pwn不讲,大部分时候逆向一个没有过度反调试和混淆的二进制文件整体思路和操作上是和代码审计一样的。所以我觉得对于大部分人来说简单学一学,也能挖到不少rce。由于我比较菜,所以有些东西可能讲错了或者是讲的皮毛,别太深究。这篇文章主要是给不太懂但是又想挖一挖的人看的。
0x01 前期准备

           
  •         准备IDA 其实也没有太多要整的,直接搞一个ida就行。之前市面上有流传着ida7.5sp3的破解版本,那个拿来用就好了。如果没有的话老一点也可以,反正我们一般人用不到太多高端功能的。

           
  •         虚拟机 搞几个虚拟机,比如ubuntu18、win10之类的。

           
  •         选目标 选定一个要挖的目标,客户端或者服务端都可以。

0x02 静态分析静态分析的时候我们只需要把二进制文件用ida打开就行了,这个有手就行就不多说了。

比如这样的界面,打开就行了。先简单介绍一下几个主要用到的东西。
1 F5伪C代码
通常我们不会直接去看冗长的汇编代码,为了方便快速的大致了解程序逻辑可以使用F5快捷键在汇编界面的时候按一下F5就会额外打开一个新的伪代码页面,如下图:

这些代码并不是真正的C代码,只是IDA根据汇编分析出来辅助阅读的,里面经常会有很多细节错误看起来十分怪异,所以在看起来脑抽的时候可以切回到汇编界面重新定位到看不懂的地方再看汇编。这个伪代码在一般情况下可以支持如函数跳转、变量的跳转,通常只要双击你要进入的函数名就行,想退回来可以点左上角的返回箭头。这一点上的操作和一般的IDE里看代码是差不多的就不细说了。另外我们还经常会想知道某个函数在哪里被哪些函数调用,这个在ida里叫做交叉引用。通过单击想要查找的函数然后按下快捷键X,就会弹出其交叉引用列表,然后你去选择要看哪个就行。这种方式同样适用于变量,如图:

2 string窗口


打开strings窗口,这个窗口会把这个程序里所有的strings都列出来,我们可以从里面搜索一些关键词,帮助我们找到一些线索。比如我们搜索“cmd”:

找到我们感兴趣的字符串然后双击

单击前面那个,直接认为是一个变量得了,同样的按X用交叉引用就能找到这个字符串被哪里引用了:

再双击交叉引用的项就能跳到具体代码了,注意跳过去通常是汇编,再按一下F5打开伪代码就行:


3 函数窗口
函数窗口一般就在左边

一般无符号的,躺平得了别去修复了,浪费时间,凑活看好了。暂时可以认为无符号的多半还是自己编写的函数,有符号的可能是引用的一些公共库什么的。所以直接当作函数名被混淆掉的来审计就行了。
这里介绍一个辅助操作就是改函数名字,因为有时候我们可以通过前后逻辑推断出这个无符号的函数大概功能,所以我们可以给他改个名字。


除了改名外,函数这块我们最常用的就是去搜带关键字的函数然后去定位,比如

搜索出带server关键词的函数名,然后根据需要去找对应函数。

4 常用函数
我们还可以去搜一些常见的危险函数,比如执行命令的system()函数,通常在这里很容易出现命令注入。

一些字符串操作函数比如sprintf

我们可以搜一下sprintf

其实就是把v12,v5两个参数放入到格式化字符串"Value (%d)%s"的对应位置里合并成一个字符串后赋值给变量s。这种字符串处理很常见的,包括其他的一些c函数在遇到时候也可以通过搜索c函数的定义来明白其作用。再讲一个sscanf。

其实用起来就是sprinf的反操作,把字符串中的数据根据format字符串提取出来赋值给后面的参数列表,有点像正则提取关键数据。同时format字符串本身也可以是正则:

具体使用可以看看手册不再多说了。

0x03 动态调试因为伪代码有时候实在是抽象,而且很多数据的访问都是采用指针+偏移的方式,有时候很难根据上下文来判断到底是什么,比如:

这里的a3+88,通常可能是只一个偏移,比如a3是指向完整请求报的开头,那么+88可能就是指往后88个字符后的内容。具体是什么很难确定,一般需要动态调试定位到这个地方后再进行观察确认。
那怎么动态调试呢?其实蛮简单的,根据方式分为:


           
  •         ida来启动进程进行调试

           
  •         attache到已经启动的进程上去,这种通常不太稳定

根据远近又分为:

           
  •         local调试即本地调试

           
  •         remote即远程调试

其实没啥子的,简单演示一下好了

debugger菜单,选择debugger,如果本地调试就选择一个看着像本地的,通常根据实际情况选。

选择完debugger后再点开debugger菜单就多了很多东西

start process就是由ida开启一个新进程然后调试,attach就是附加到已经运行的进程上去,一般非必要的时候就直接start process就行了。由于我这边是windows的ida然后由静态打开的linux的二进制,所以我本地分析不了。我们直接看远程的。当我们用windows的ida想要动态调试Linux二进制时需要使用远程调试,打开一个ubutun虚拟机,然后把ida目录下的linux调试服务器进程复制到ubuntu里

这里是linux_server64,因为我们需要在远程服务器运行这个调试服务,所以需要选择对应的系统。复制到ubuntu后,chmod+x然后运行

这样就行了,调试服务端就完成了,接下来在ida里配置一下debugger



接下来就回到之前的调试了,start process也行,attache也行,这里演示一下attach

选择attach后就选择一个你要attach的进程,然后就和本地调试没太多区别了。 这里建议先本地静态分析一下对应的二进制文件,然后再设置其远程linux调试,直接startprocess,这样似乎就可以使用伪代码来单步调试了

效果:

在ubuntu调试服务端还能看到打印出来了运行程序的日志信息

那到这个页面后我们怎么调试呢?

重新打开函数窗口,然后定位到具体要打断点的函数,比如

这里我通过函数窗口跳到我喜欢的函数,然后按了下F5后再在函数入口打了个断点,因为程序一直在运行但是我们没有发送请求去触发他运转到这个断点处所以并没有断下来。仔细看函数名handlerhttprequest也就是说可能是处理http请求的,那么我们只需要对进程发送http请求可能就能触发断点了。具体就不再演示了,大致上的调试逻辑可以按照这个来,这里断点后按单步调试会在伪代码上进行单步,这样就和代码动态调试整体上是一致的了。

0x04 简单审计静态和动态大致操作都讲过了,当我们掌握上面所讲的一些基本操作技巧后基本能满足绝大部分场景。那么作为web选手必然是会一定的web代码审计的,在ida这顿操作后接下来就是暗示自己现在用的是IDEA看的是JAVA代码就行了,我们可以审计比如:

           
  •         权限校验

           
  •         加解密算法,重要token加密构成

           
  •         危险函数使用导致执行系统命令

           
  •         sql注入

           
  •         数据流的过滤处理

           
  •         任意读写文件

大致上也就看这些吧,如果有RCE肯定看RCE,没有RCE看越权看注入看读写文件。一般的服务端二进制多为CGI程序,而这种CGI程序多半是出现在XXX设备比如防火墙,因为这些设备需要和系统底层的功能进行交互所以用C来写也很常见,又由于和系统底层交互所以会经常性使用system之类的函数来拼接系统命令。这就给了我们很多个命令注入的可能性。说到这里懂的都懂懂懂了吧?web选手从这个角度来切入二进制的话,还是可以卷很多东西的。

回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|安全矩阵

GMT+8, 2024-11-29 06:24 , Processed in 0.016016 second(s), 18 queries .

Powered by Discuz! X4.0

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表