[DASCTF Sept 2021]ea5ycpp
直接爆破
-
根据
start
入口定位到main
函数,看到了一些被赋值的元数据:.text:00005652C48B552D mov [rdx], al .text:00005652C48B552F add rdx, 1 ; Add .text:00005652C48B5533 mov byte ptr [rbp-120h], 68h ; 'h' .text:00005652C48B553A mov byte ptr [rbp-11Fh], 6Fh ; 'o' .text:00005652C48B5541 mov byte ptr [rbp-11Eh], 65h ; 'e' .text:00005652C48B5548 mov byte ptr [rbp-11Dh], 6Ch ; 'l' .text:00005652C48B554F mov byte ptr [rbp-11Ch], 81h .text:00005652C48B5556 mov byte ptr [rbp-11Bh], 69h ; 'i' .text:00005652C48B555D mov byte ptr [rbp-11Ah], 7Ah ; 'z' .text:00005652C48B5564 mov byte ptr [rbp-119h], 3Dh ; '=' .text:00005652C48B556B mov byte ptr [rbp-118h], 3Bh ; ';' .text:00005652C48B5572 mov byte ptr [rbp-117h], 79h ; 'y' .text:00005652C48B5579 mov byte ptr [rbp-116h], 6Bh ; 'k' .text:00005652C48B5580 mov byte ptr [rbp-115h], 73h ; 's' .text:00005652C48B5587 mov byte ptr [rbp-114h], 38h ; '8' .text:00005652C48B558E mov byte ptr [rbp-113h], 39h ; '9' .text:00005652C48B5595 mov byte ptr [rbp-112h], 7Bh ; '{' .text:00005652C48B559C mov byte ptr [rbp-111h], 70h ; 'p' .text:00005652C48B55A3 mov byte ptr [rbp-110h], 7Bh ; '{' .text:00005652C48B55AA mov byte ptr [rbp-10Fh], 48h ; 'H' .text:00005652C48B55B1 mov byte ptr [rbp-10Eh], 73h ; 's' .text:00005652C48B55B8 mov byte ptr [rbp-10Dh], 7Ch ; '|' .text:00005652C48B55BF mov byte ptr [rbp-10Ch], 85h .text:00005652C48B55C6 mov byte ptr [rbp-10Bh], 47h ; 'G' .text:00005652C48B55CD mov byte ptr [rbp-10Ah], 7Ch ; '|' .text:00005652C48B55D4 mov byte ptr [rbp-109h], 96h .text:00005652C48B55DB lea rax, [rbp-160h] ; Load Effective Address .text:00005652C48B55E2 mov rdi, rax
-
查看逆向代码:
这段都是STL库函数操作,因此比较复杂。我们试图略过这些代码,因为他们太复杂
(其实可以看到这些库函数操作都相同,并且重复了24次——正好是flag的长度)std::allocator<char>::allocator(&v11); std::__cxx11::basic_string<char,std::char_traits<char>,std::allocator<char>>::basic_string(); sub_5652C48B6876(v13, v15); std::__cxx11::basic_string<char,std::char_traits<char>,std::allocator<char>>::~basic_string(v15); std::allocator<char>::~allocator(&v11); sub_5652C48B6936(v13);
(重复的代码)
我们输入一些字符串进去试试,在for ( i = 0; i <= 23; ++i )
下断点
(IDA动态调试内容在此不表)
输入25个零:
0000000000000000000000000
查看IDA调试的变量地址:
根据此地址跟踪到相应位置:
可以看到按照数字顺序产生的数据,并且我们输入的都是相同的数据,故而猜测逻辑为:
对输入的数据进行移位变换,然后加上一个迭代变量。据此可以进行代码人工识别
(这里可以多输入一些数据进行试验,笔者实验了
A~Z
和a~z
,0~9
所有字符,都符合这样的假说) -
raw代码人工识别:
#include <stdio.h> #include "defs.h" char raw[] = { 0x68, 0x6F, 0x65, 0x6C, 0x81, 0x69, 0x7A, 0x3D, 0x3B, 0x79, 0x6B, 0x73, 0x38, 0x39, 0x7B, 0x70, 0x7B, 0x48, 0x73, 0x7C, 0x85, 0x47, 0x7C, 0x96 }; int main(int argc, char** argv) { for (int i = 0; i < 128; i++)//目的是尝试不同的移位可能,最多有128种。 { for (int j = 0; j < 24; j++)//对raw进行更新 { printf("%c", (raw[j] - j) - i); } printf("\n"); } return 0; }
flag{br41n_f**k_i5_go0d}
作者发布、转载的任何文章中所涉及的技术、思路、工具仅供以安全目的的学习交流,并严格遵守《中华人民共和国网络安全法》、《中华人民共和国数据安全法》等网络安全法律法规。
任何人不得将技术用于非法用途、盈利用途。否则作者不对未许可的用途承担任何后果。
本文遵守CC BY-NC-SA 3.0协议,您可以在任何媒介以任何形式复制、发行本作品,或者修改、转换或以本作品为基础进行创作
您必须给出适当的署名,提供指向本文的链接,同时标明是否(对原文)作了修改。您可以用任何合理的方式来署名,但是不得以任何方式暗示作者为您或您的使用背书。
同时,本文不得用于商业目的。混合、转换、基于本作品进行创作,必须基于同一协议(CC BY-NC-SA 3.0)分发。
如有问题, 可发送邮件咨询.