-
-
[原创]红帽杯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'
脚本
通过这个脚本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平台漏洞挖掘!
赞赏
- [求助]confuser手动脱壳缺少模块 4559
- Net脱壳修复失败 3786
- [求助]dnspy修改代码后不能保存 4626
- CreateProcess启动指定程序不能保持运行 3988
- [求助]QT缺失<QtWin>的头文件,如何解决 5265