Again Find the Flag
100
Run, enter correct password and capture the flag.
Flag is MD5 of the correct password:
UUTCTF{MD5(Correct Password)}
objdumpコマンドで逆アセンブルします。
以下の箇所で入力文字列の長さが19文字であることをチェックしています。$ objdump -s -D -M intel chal_re_med.so >aaa.txt
772: 48 c7 c1 ff ff ff ff mov rcx,0xffffffffffffffff779: f2 ae repnz scas al,BYTE PTR es:[rdi]77b: b8 00 00 00 00 mov eax,0x0780: 48 83 f9 eb cmp rcx,0xffffffffffffffeb #19文字784: 74 23 je 7a9
以下の箇所で4文字目、9文字目、14文字目が_であることをチェックしています。
7c1: 80 3c 32 5f cmp BYTE PTR [rdx+rsi*1],0x5f #4文字目、9文字目、14文字目_以下の箇所で0文字目、5文字目、10文字目、15文字目が9以下であることをチェックしています。7c5: 0f 85 31 02 00 00 jne 9fc
7da: 80 f9 09 cmp cl,0x97dd: 0f 87 23 02 00 00 ja a06 #0文字目、5文字目、10文字目、15文字目9より大きいNG
以下の箇所で1~3文字目、6~8文字目、11~13文字目、16~18文字目が9以下であることをチェックしています。
7f4: 80 f9 09 cmp cl,0x97f7: 76 ea jbe 7e3 #1~3、6~8、11~13、16~18文字目9以下OK
以下の箇所で、0x55555556×nは、nが0~2のとき桁あふれ(edx)は0、3~5のときedxは1、・・・となります。したがって、(0文字目+1文字目+2文字目+3文字目+5文字目+6文字目+7文字目+8文字目+10文字目+11文字目+12文字目+13文字目)÷3の商と(15文字目+16文字目+17文字目+18文字目)が一致することをチェックしています。
以下の箇所で、同様に、(10文字目+11文字目+12文字目+13文字目)÷3の商と(0文字目+1文字目+2文字目+3文字目)が一致することをチェックしています。984: ba 56 55 55 55 mov edx,0x55555556989: 89 c8 mov eax,ecx #eax=0文字目+1文字目+2文字目+3文字目+5文字目+6文字目+7文字目+8文字目+10文字目+11文字目+12文字目+13文字目98b: f7 ea imul edx #eax=eax×edx、edxは桁あふれ98d: c1 f9 1f sar ecx,0x1f #右31ビットシフト、ecx=0990: 29 ca sub edx,ecx992: b8 00 00 00 00 mov eax,0x0997: 41 39 d0 cmp r8d,edx99a: 0f 85 e6 fd ff ff jne 786 #15文字目+16文字目+17文字目+18文字目とedxが一致しないとNG
以下の箇所で、(0文字目+1文字目+2文字目+3文字目)と(5文字目+6文字目+7文字目+8文字目)が一致しないことをチェックしています。9a0: ba 56 55 55 55 mov edx,0x555555569a5: 89 f0 mov eax,esi #eax=10文字目+11文字目+12文字目+13文字目9a7: f7 ea imul edx #eax=eax×edx、edxは桁あふれ9a9: c1 fe 1f sar esi,0x1f #右31ビットシフト9ac: 29 f2 sub edx,esi9ae: 44 39 da cmp edx,r11d9b1: 75 05 jne 9b8 #edxと0文字目+1文字目+2文字目+3文字目が一致しないとNG
9b3: 45 39 eb cmp r11d,r13d9b6: 75 0a jne 9c2 #0文字目+1文字目+2文字目+3文字目と5文字目+6文字目+7文字目+8文字目が一致しなければOK
以下の箇所で、0~3文字目と10~13文字目の各桁が一致しないことをチェックしています。
9c2: 48 8d 74 24 30 lea rsi,[rsp+0x30] #10文字目9c7: 48 8d 7c 24 10 lea rdi,[rsp+0x10] #0文字目9cc: e8 49 fd ff ff call 71a <sameAtIndex>
以下の箇所で、同様に、5~8文字目と15~18文字目の各桁が一致しないことをチェックしています。
9e0: 48 8d 74 24 40 lea rsi,[rsp+0x40] #15文字目9e5: 48 8d 7c 24 20 lea rdi,[rsp+0x20] #5文字目9ea: e8 2b fd ff ff call 71a <sameAtIndex>
以上を満たす入力値として"1234_5678_6789_4567"を試してみます。
合っているようなのでmd5ハッシュ値を求めてsubmitしますがフラグではないようです。$ ./chal_re_med.so 1234_5678_6789_4567You entered it right! Congratulations
他にもいくらでも条件を満たす入力値があります。UUTCTF{26973e24d232cc103a9e778554193cb3}
$ ./chal_re_med.so 2341_5678_6789_4567You entered it right! Congratulations$ ./chal_re_med.so 3333_6666_9999_5577You entered it right! Congratulations