-
-
[原创] KCTF2020 秋季赛 第七题 鱼目混珠
-
2020-12-15 00:23 6099
-
作者写了好多花指令,包括\x70
~\x7F
的跳转都用了,震惊。。写个脚本把用到的花都去掉。
然后F5,顺着main函数看。
先是一系列函数指针。前面几个都是反调试,后面的是check_sum
1 2 3 4 5 6 7 8 9 10 11 12 13 14 | func_ptr[ 0 ] = sub_401700; func_ptr[ 1 ] = sub_401740; func_ptr[ 2 ] = sub_4017B0; func_ptr[ 3 ] = sub_401890; func_ptr[ 4 ] = sub_4018F0; func_ptr[ 5 ] = sub_401570; func_ptr[ 6 ] = sub_401820; func_ptr[ 7 ] = sub_401950; func_ptr[ 8 ] = sub_401AB0; func_ptr[ 9 ] = check_sum_main; / / 算main函数是否被patch func_ptr[ 10 ] = check_sum_anti_debug; / / 算anti - debug函数是否被patch func_ptr[ 11 ] = sub_401620; |
然后对输入的前7字节,后最后7字节进行了一个验证。因为有点麻烦,我这里先没看,直接patch没了。
后面的内容,调试一下,可以看出,作者是写了个大数结构。
1 2 3 4 | struct bg{ int len ; / / 大数的长度 char num[ 32 ]; / / 大数每一位的值 }; |
然后运算和赋值大概长这个样子
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 | R1_data[ 4 ] = 0 ; * R1_data = * str1_data; / / 给大数的data部分赋值 v15 = 4 ; while ( 1 ) / / 这段 while 算大数的长度 v16 = v15 - 1 ; if ( R1_data[v15 - 1 ] ) break ; - - v15; if ( !v16 ) goto LABEL_29; } v16 = v15; LABEL_29: R1. len = v16; / / 把长度赋好 mul(&R0, &R2. len , &R1. len ); / / 运算,R1和R2的相乘,赋值给R0 |
整理一下运算。以为最后是比较R1和str1。。所以以为后面的R3运算没用了。。后面调试发现坑点在于,操作可能会溢出,而R3和str1挨着,所以R3运算可能会溢出搞掉str1。会导致str1的大数结构的长度变1,导致sstr1瞬间变成1.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 | # 内存排布 R2, R1, R0, R3, str1, str2 R2 = inp R1 = 0x10010401 R0 = R1 * R2 R2 = 0x0E053D0F R0 / = R2 R0 + = str1 R0 + = str2 R3 = str1 * str2 R1 = R0 - R3 # overflow to...str1 R0 * = R2 R3 = R0 * 37 R3 + = R3 R1 = = str1 ? |
写个脚本,并且微调一下。发现算术上check是可以通过的,为什么flag不对呢。。
然后想起来开局一堆反调试被我patch了,可后面已经通过check了,前面反调试验证前7后7有啥用呢。然后意识到可能是大小写。把答案改成大写OK了,所以前面是为了防止多解吧。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 | # input: 5567890123456789, low -> high # store: 0x55, 0x76, 0x90, 0x10, 0x32, 0x54, 0x76, 0x98 # means: 0x9876543210987655 # a...zhe... ''' R0 = inp * 0x10010401 / 0xE053D0F + (str1 + str2) R1 = R0 - str1 * str2 R3 = R0 * 37 * 2 / 0xE053D0F R1 == str1(overflow) inp * 0x10010401 / 0xE053D0F + str1 + str2 - str1 * str2 == 1 ''' str1 = 0x3FAFFA2B01B6BA9744C4B4E010010401 str2 = 0xFEA1BD9E6964129D8F5079E1 str1_over = 1 #r = (str1 * str2 - str1 - str2 + str1_over) * 0xE053D0F / 0x10010401 r = (str1 * str2 - str1 - str2 + str1_over + 1 ) * 0xE053D0F / 0x10010401 print hex (r) R0 = r * 0x10010401 print hex (R0) R0 = R0 / 0xE053D0F print hex (R0) R0 = R0 + str1 + str2 print hex (R0) R3 = str1 * str2 print hex (R3) R1 = R0 - R3 print R1 # 1 R0 = R0 * 0xE053D0F print hex (R0) R3 = R0 * 37 print hex (R3) #... ''' PS C:\ctf\132_KCTF_q3\problem-7> .\lelfei-KCTF2020.exe INPUT:10C7F30833B9C4563BF035C32D8C7709E040FCA64E211F34CD3FE773 GOOD! ''' |
[培训]《安卓高级研修班(网课)》月薪三万计划,掌握调试、分析还原ollvm、vmp的方法,定制art虚拟机自动化脱壳的方法
赞赏
他的文章
看原图