【逆向系列】3-某球热点acw_sc__v2加密逆向

逆向病毒分析 1年前 (2022) admin
519 0 0


免责声明

本文章中所有内容仅供学习交流使用,不用于其他任何目的,不提供完整代码,抓包内容、敏感网址、数据接口等均已做脱敏处理,严禁用于商业用途和非法用途,否则由此产生的一切后果均与作者无关!
本文章未经许可禁止转载,禁止任何修改后二次传播,擅自使用本文讲解的技术而导致的任何意外,作者均不负责,若有侵权,请在微信公众号【小白逆向】联系作者立即删除!

前言

acw_sc__v2在逆向反爬中,经常遇到。本次分享中笔者将其以十分详细的方式来分享给大家。

逆向目标

  • 逆向目标:某球热帖cookie加密:acw_sc__v2
  • 逆向主页:aHR0cHM6Ly94dWVxaXUuY29tL3RvZGF5
  • 逆向接口:aHR0cHM6Ly94dWVxaXUuY29tL3N0YXR1c2VzL2hvdC9saXN0VjIuanNvbg==
  • 脱敏处理(base64编码)
  • 涉及知识点:OB混淆、无限debugger、解OB混淆、控制台巧妙使用、无痕浏览器的使用

网络抓包分析

本次抓包会比较特殊一点
1、首先打开浏览器的首页,根据图中进行操作

【逆向系列】3-某球热点acw_sc__v2加密逆向

2、在再在浏览器地址栏输入目标地址


【逆向系列】3-某球热点acw_sc__v2加密逆向

3、按照图中进行操作后,回车向目标地址发起请求。

【逆向系列】3-某球热点acw_sc__v2加密逆向


4、就会来到这个页面,并且会自动断住。如果没有断住,那么关闭浏览器将当前步骤重新来一遍。


acw_sc__v2逆向分析

1、点击跳出当前函数

【逆向系列】3-某球热点acw_sc__v2加密逆向


然后再格式化代码,来到当前页面

【逆向系列】3-某球热点acw_sc__v2加密逆向


2、拉动滑轮来到文章的底部,可以看当前的加密参数acw_sc__v2

【逆向系列】3-某球热点acw_sc__v2加密逆向


3、并在此参数的位置断下断点,然后点击执行跳到下一断点

【逆向系列】3-某球热点acw_sc__v2加密逆向


选择Never pause here
4、再次点击跳到下一断点,现在来到我们自己断下的断点。

【逆向系列】3-某球热点acw_sc__v2加密逆向


5、查看堆栈信息,点击最后一个栈

【逆向系列】3-某球热点acw_sc__v2加密逆向


6、程序来到图中红框的位置,发现这种编码,是不是很熟悉?对,它又是16进制编码。 



【逆向系列】3-某球热点acw_sc__v2加密逆向


这里使用笔者自己写编码解码脚本


# **************************************
# --*-- coding: utf-8 --*--
# @Time    : 2022-12-06
# @Author  : white
# @FileName: hex_to_str.py
# @Software: PyCharm
# **************************************
import re
s = r'''setTimeout('x72x65x6cx6fx61x64x28x61x72x67x32x29', 0x2);'''
for i in re.findall("\\x[0-9a-f]+", s, re.DOTALL):
    s = s.replace(i, chr(int(i[2:],16)))
print(s)

7、解码出来是setTimeout('reload(arg2)', 0x2);,可以看到就是咋们自己断下的断点的函数名。所以分析其中arg2的来源。这里直接将arg2 = _0x23a392[_0x55f3('0x1b', 'x7ax35x4fx26')](_0x5e8b26);复制到本地环境中,然后进行调试运行,根据调试报错结果去补相应的环境依赖。

【逆向系列】3-某球热点acw_sc__v2加密逆向


8、_0x23a392为未定义,所以找它的定义位置,位置信息就在其上一行。var _0x23a392 = arg1[_0x55f3('0x19', 'x50x67x35x34')]();

【逆向系列】3-某球热点acw_sc__v2加密逆向


9、arg1未定义,所以直接在控制台输入arg1

【逆向系列】3-某球热点acw_sc__v2加密逆向

它是一个定值,不防想想在当前文件中搜索这个定值。

【逆向系列】3-某球热点acw_sc__v2加密逆向

10、查找到只有这一个结果,所以它是随着js文件一起返回的,所以后续我们通过正则匹配将其匹配出来。
11、添加了arg1在本地再次运行调试。



【逆向系列】3-某球热点acw_sc__v2加密逆向


_0x55f3报错未定义,这里将_0x55f3('0x19', 'x50x67x35x34')_0x55f3('0x1b', 'x7ax35x4fx26')放到浏览器的控制台中进行输出

【逆向系列】3-某球热点acw_sc__v2加密逆向


12、发现输出的结果是一个字符串,所以大致可以确定,_0x55f3是一个混淆解析函数,所以不用去扣取这个函数,如果在后续提示这个函数报错,直接将这个函数以及其传入的参数放到控制台中执行,将得到的字符串替换掉本地的函数,比如像这样:


【逆向系列】3-某球热点acw_sc__v2加密逆向

13、那么接下来的操作就是类似的了,比如像现在:

【逆向系列】3-某球热点acw_sc__v2加密逆向


那么直接在控制太中输入arg1["unsbox"]即可

【逆向系列】3-某球热点acw_sc__v2加密逆向


14、点击输出的结果到对应的函数,再将其复制到本地即可。

【逆向系列】3-某球热点acw_sc__v2加密逆向


15、然后将其中的_0x55f3解混淆即可,对于解混淆时,可以采用每次的报错信息来解。

【逆向系列】3-某球热点acw_sc__v2加密逆向


图中的红框就是经过解混淆的了。
16、现在报错_0x5e8b26未定义,所以在控制台中进行输出

【逆向系列】3-某球热点acw_sc__v2加密逆向


17、但是这里报错了,原因可能是在当前的堆栈环境中没有这个变量的值,但是也不碍于咋们分析它,所以直接在当前文件中搜索它

【逆向系列】3-某球热点acw_sc__v2加密逆向


18、在搜索的第5个结果中发现它被混淆了,所以接下混淆

【逆向系列】3-某球热点acw_sc__v2加密逆向


这里得知,它是一大长串数字,所以将这个数字复制到本地。
19、再次运行代码执行,又报错_0x23a392.hexXor is not a function说它不是一个函数

【逆向系列】3-某球热点acw_sc__v2加密逆向


20、同样的方法,在控制台输入这个函数_0x23a392.hexXor

【逆向系列】3-某球热点acw_sc__v2加密逆向


同样得到了相应的函数,与当前步骤的13步以及后续步骤一样的操作,对其进行扣取,然后解混淆。
21、这是笔者扣取的结果

【逆向系列】3-某球热点acw_sc__v2加密逆向


22、再次运行js代码

【逆向系列】3-某球热点acw_sc__v2加密逆向


成功拿到加密cookie结果~~~
23、对加密接口进行包装


function white(arg1{
    var _0x5e8b26 = '3000176000856006061501533003690027800375';
    var _0x23a392 = arg1['unsbox']();
    arg2 = _0x23a392['hexXor'](_0x5e8b26);
    return arg2
}

arg1为每次调用函数需要传入的参数。


【逆向系列】3-某球热点acw_sc__v2加密逆向


acw_sc__v2获取流程分析

1、首先请求主页地址,拿到网页初步返回的混淆代码结果;
2、拿到返回结果后,提取出arg1的值进行本地加密;
3、再次向首页地址发起请求,获取网页返回的cookie;
4、携带两次cookie向接口url发起请求,获取最终数据。

总结

测试用例,不能直接运行

# **************************************
# --*-- coding: utf-8 --*--
# @Time    : 2022-12-06
# @Author  : white
# @FileName: 某球.py
# @Software: PyCharm
# **************************************
import requests
import execjs
import re

cookies = dict()

def get_cookie():
    '''获取acw_tc cookie'''
    headers = {
        "User-Agent""Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/106.0.0.0 Safari/537.36 Edg/106.0.1370.52",
    }
    url = 'https:脱敏处理/today'
    res = requests.get(url=url, headers=headers)
    arg1 = re.findall("varsarg1='(.*)'", res.text)[0]
    cookies.update(res.cookies.get_dict())
    cookies['acw_sc__v2'] = execjs.compile(open('./acw_sc__v2.js', encoding='utf-8').read()).call('white', arg1)
    # 第二次获取cookie
    res = requests.get(url=url, headers=headers, cookies=cookies)
    cookies.update(res.cookies.get_dict())
def get_data():
    if not cookies:
        get_cookie()
    url = 'https:脱敏处理/listV2.json'
    data = {
        "since_id""-1",
        "max_id""-1",     # 响应头中的 next_id
        "size""15"
    }
    headers = {
        "Host""脱敏处理.com",
        "Referer""https:脱敏处理/today",
        "sec-ch-ua"""Chromium";v="106", "Microsoft Edge";v="106", "Not;A=Brand";v="99"",
        "User-Agent""Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/106.0.0.0 Safari/537.36 Edg/106.0.1370.52",
    }
    res = requests.get(url=url, params=data, headers=headers, cookies=cookies).json()
    print('next_id: ',res['next_id'])
    print('next_max_id',res['next_max_id'])
    for i in res['items']:
        room = dict()
        room['标题'] = i['original_status']['title']
        room['描述'] = i['original_status']['description']
        room['原标题'] = i['original_status']['rawTitle']
        room['时间'] = i['original_status']['timeBefore']
        room['标签'] = i['original_status']['tagsForWeb']
        print(room)

get_data()

成功截图:


【逆向系列】3-某球热点acw_sc__v2加密逆向

相关代码已在github开源

https://github.com/puboop/reverse/

原文始发于微信公众号(小白逆向):【逆向系列】3-某球热点acw_sc__v2加密逆向

版权声明:admin 发表于 2022年12月7日 上午10:00。
转载请注明:【逆向系列】3-某球热点acw_sc__v2加密逆向 | CTF导航

相关文章

暂无评论

您必须登录才能参与评论!
立即登录
暂无评论...