首页
社区
课程
招聘
[原创]红帽杯2019
发表于: 2022-5-20 23:18 16156

[原创]红帽杯2019

2022-5-20 23:18
16156



先输入字符串
下边判断长度等于31
sub_7FF74A631280输出字符串首字母,放在v4
sub_7FF74A6315C0用递归遍历字符串并改变顺序存在name里
这里的遍历其实是二叉树遍历还是后序的
输入字符串: 1234567890abcdefghijklmnopqrstu
输出字符串: fg8hi94jk0lma52nobpqc6rsdtue731

Abcdeabcdeabcdeabcdeabcdeabcdez
下边是变换后的顺序

判断v9等于62
将a1234567890Qwer字符串与0x7FF655C93478和 0x7FF655C93438i64
两个字符串比较判断
用outputString的值除和取余操作后作为a1234567890Qwer角标

P= private: char __thiscall R0Pxx::My_Aut0_PWN(unsigned char )

此脚本提取满足判断条件的a1234567890Qwer的输入字符串
但是md5提交后发现不对
重新审计代码


outputString在UnDecorateSymbolName函数中被改过
此函数是去掉C++函数名修饰
根据此规则还原函数修饰:
?My_Aut0_PWN@R0Pxx@@AAEPADPAE@Z

这里看到函数修饰字符串由v5得来,所以outputSring是输入值的后序遍历
结果:Z0atRAEyup@XAAA?M_A0_WNPX@@EPDP

第二种解法
这个脚本是对二叉树的逆序解释


Sub_4406E0是输入函数,要求输入长度为36个字符
下边是一个循环异或,v12在动态调试下给出
脚本

通过脚本得到第一次输入的字符串为Info:The first four chars are flag


第二次输入到v51,经过十次sub_400E44(base64)的结果放到Sub_400360与off_6cc090比较
结果正确那么输出字符串'you find me'
off_6cc090
脚本

通过这个脚本10次base64反编码解得一个网址:https://bbs.pediy.com/thread-254172.htm
但是依然不是flag


可以看出这个函数是.fini节调用

main的返回地址是libc_start_main也就是说main并不是程序真正开始的地方,libc_start_main的执行是在main的前面。
可以发现libc_start_main函数的参数中有三个指针 libc_csu_fini是在main执行完毕后执行的,之前分析的程序与__libc_csu_fini内的函数没有关系


V8与byte_6cc0a0第一项和第三项异或得到 'f’, 'g’
那么v8与byte_6cc0a0异或就是flag
所以'flag'与byte_6cc0a0前四项异或得到v8
V8是int型拆分成四个char型字符成为数组与byte_6cc0a0循环异或

flag脚本结果:flag{Act1ve_Defen5e_Test}

博客: https://qwer597.github.io/

hello

s3478 = "(_@4620!08!6_0*0442!@186%%0@3=66!!974*3234=&0^3&1@=&0908!6_0*&"
s3438 = "55565653255552225565565555243466334653663544426565555525555222"
s = '1234567890-=!@#$%^&*()_+qwertyuiop[]QWERTYUIOP{}asdfghjkl;,ASDFGHJKL:"ZXCVBNM<>?zxcvbnm,./'
p = ''
for i in range(62):
    p += chr(s.find(s3478[i]) + s.find(s3438[i])*23 )
 
print (p)
s3478 = "(_@4620!08!6_0*0442!@186%%0@3=66!!974*3234=&0^3&1@=&0908!6_0*&"
s3438 = "55565653255552225565565555243466334653663544426565555525555222"
s = '1234567890-=!@#$%^&*()_+qwertyuiop[]QWERTYUIOP{}asdfghjkl;,ASDFGHJKL:"ZXCVBNM<>?zxcvbnm,./'
p = ''
for i in range(62):
    p += chr(s.find(s3478[i]) + s.find(s3438[i])*23 )
 
print (p)
 
 
 
#include <stdio.h>
#include <string.h>
int main()
{
    char name[32] = "?My_Aut0_PWN@R0Pxx@@AAEPADPAE@Z";
    int biao[] = { 0x50, 0x51, 0x48, 0x52, 0x53, 0x49, 0x44, 0x54, 0x55, 0x4a, 0x56, 0x57, 0x4b, 0x45, 0x42, 0x58, 0x59, 0x4c, 0x5a, 0x5b, 0x4d, 0x46, 0x5c, 0x5d, 0x4e, 0x5e, 0x5f, 0x4f, 0x47, 0x43, 65 };
    char input[32] = { 0 };
    int i;
    for (i = 0; i < strlen(name); i++)
        input[biao[i] - 65] = name[i];
    puts(input);
    return 0;
}
#include <stdio.h>
#include <string.h>
int main()
{
    char name[32] = "?My_Aut0_PWN@R0Pxx@@AAEPADPAE@Z";
    int biao[] = { 0x50, 0x51, 0x48, 0x52, 0x53, 0x49, 0x44, 0x54, 0x55, 0x4a, 0x56, 0x57, 0x4b, 0x45, 0x42, 0x58, 0x59, 0x4c, 0x5a, 0x5b, 0x4d, 0x46, 0x5c, 0x5d, 0x4e, 0x5e, 0x5f, 0x4f, 0x47, 0x43, 65 };
    char input[32] = { 0 };
    int i;
    for (i = 0; i < strlen(name); i++)
        input[biao[i] - 65] = name[i];
    puts(input);

[招生]系统0day安全班,企业级设备固件漏洞挖掘,Linux平台漏洞挖掘!

最后于 2022-6-15 10:54 被wx_好一脚头球编辑 ,原因:
收藏
免费 2
支持
分享
最新回复 (0)
游客
登录 | 注册 方可回帖
返回
//