Reverse

UUT CTF writeup Again Find the Flag

Again Find the Flag

100

Linux

Run, enter correct password and capture the flag.

Flag is MD5 of the correct password:

UUTCTF{MD5(Correct Password)}

objdumpコマンドで逆アセンブルします。
$ objdump -s -D -M intel chal_re_med.so >aaa.txt
以下の箇所で入力文字列の長さが19文字であることをチェックしています。
 772: 48 c7 c1 ff ff ff ff mov    rcx,0xffffffffffffffff
 779: f2 ae                repnz scas al,BYTE PTR es:[rdi]
 77b: b8 00 00 00 00        mov    eax,0x0
 780: 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文字目_
 7c5: 0f 85 31 02 00 00    jne    9fc
以下の箇所で0文字目、5文字目、10文字目、15文字目が9以下であることをチェックしています。
 7da: 80 f9 09              cmp    cl,0x9
 7dd: 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,0x9
 7f7: 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文字目)が一致することをチェックしています。
 984: ba 56 55 55 55        mov    edx,0x55555556
 989: 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=0
 990: 29 ca                sub    edx,ecx
 992: b8 00 00 00 00        mov    eax,0x0
 997: 41 39 d0              cmp    r8d,edx
 99a: 0f 85 e6 fd ff ff    jne    786 #15文字目+16文字目+17文字目+18文字目とedxが一致しないとNG
以下の箇所で、同様に、(10文字目+11文字目+12文字目+13文字目)÷3の商と(0文字目+1文字目+2文字目+3文字目)が一致することをチェックしています。
 9a0: ba 56 55 55 55        mov    edx,0x55555556
 9a5: 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,esi
 9ae: 44 39 da              cmp    edx,r11d
 9b1: 75 05                jne    9b8 #edxと0文字目+1文字目+2文字目+3文字目が一致しないとNG
以下の箇所で、(0文字目+1文字目+2文字目+3文字目)と(5文字目+6文字目+7文字目+8文字目)が一致しないことをチェックしています。
 9b3: 45 39 eb              cmp    r11d,r13d
 9b6: 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"を試してみます。
$ ./chal_re_med.so 1234_5678_6789_4567

You entered it right! Congratulations
合っているようなのでmd5ハッシュ値を求めてsubmitしますがフラグではないようです。
UUTCTF{26973e24d232cc103a9e778554193cb3}
他にもいくらでも条件を満たす入力値があります。
$ ./chal_re_med.so 2341_5678_6789_4567

You entered it right! Congratulations

$ ./chal_re_med.so 3333_6666_9999_5577

You entered it right! Congratulations
結局フラグは分かりません。



UUT CTF writeup Find The Password

Find The Password

25

Windows

Run the application and find the password.

fileコマンドでファイルタイプを確認します。
$ file FindThePassword.exe 
FindThePassword.exe: PE32 executable (GUI) Intel 80386 Mono/.Net assembly, for MS Windows
.NetアプリケーションなのでILSpyで逆コンパイルします。Form2のリソースのPictureBox1.Imageの画像データにフラグが記載されています。

1

Y0u_h4v3_f0uNd_coRr3Ct_FL4Gのsha1ハッシュ値を求めます。
フラグは、
UUTCTF{6DEE35B953027DEBE077E05BBE7E488F8AB335C4}
です。



UUT CTF writeup The Puzzle

The Puzzle

75

Windows

Solve the puzzle!

ILSpyで逆コンパイルします。Image_part_001~Image_part_009の9つのリソースを抽出します。抽出した9つの画像ファイルを縦横につなげてQRコードの画像ファイルを作ります。

1

PythonでこのQRコードを読み取らせます。
from PIL import Image, ImageSequence
from pyzbar.pyzbar import decode

im = Image.open('1.png')
data = decode(im)
print(data[0][0].decode('utf-8', 'ignore'))
実行するとBase64のエンコード文字列が得られます。
$ python aaa.py
VVVUQ1RGe21kNShJX2wwVjNfcEw0eTFOZ19QdVp6MWVTKX0=
Base64でデコードします。
$ python aaa.py | base64 -d
UUTCTF{md5(I_l0V3_pL4y1Ng_PuZz1eS)}
フラグは、
UUTCTF{9ad589e4c948c9ecd46bf2c55c3049b5}
です。



UTCTF wirteup [basics] re

[basics] re

100

I know there's a string in this binary somewhere.... Now where did I leave it?

by balex

stringsコマンドでファイル中の文字列を調べます。
$ strings calculator 
/lib64/ld-linux-x86-64.so.2
& 1y
libc.so.6
__isoc99_scanf
__stack_chk_fail
printf
__libc_start_main
__gmon_start__
GLIBC_2.7
GLIBC_2.2.5
GLIBC_2.4
UH-H
AWAVA
AUATL
[]A\A]A^A_
Enter an operator (+, -, *,): 
Enter two operands: 
%lf %lf
%.1lf + %.1lf = %.1lf
%.1lf - %.1lf = %.1lf
%.1lf * %.1lf = %.1lf
%.1lf / %.1lf = %.1lf
Error! operator is not correct
utflag{str1ng5_15_4_h4ndy_t00l}
;*3$"
フラグは、
utflag{str1ng5_15_4_h4ndy_t00l}

Quals: Saudi and Oman National Cyber Security CTF writeup I love this guy

Category:Malware Reverse Engineering
Level:medium
Points:100

Points

Can you find the password to obtain the flag?


fileコマンドでファイルタイプを確認します。.NETアプリケーションです。
$ file ScrambledEgg.exe 
ScrambledEgg.exe: PE32 executable (GUI) Intel 80386 Mono/.Net assembly, for MS Windows
dnSpyで.NETアプリケーションを逆コンパイルします。逆コンパイルされたソースコードのButton_Clickイベントの箇所を確認します。
public char[] Letters = "ABCDEFGHIJKLMNOPQRSTUVWXYZ{}_".ToCharArray();

private void Button_Click(object sender, RoutedEventArgs e)
{
string value = new string(new char[]
{
this.Letters[5],
this.Letters[14],
this.Letters[13],
this.Letters[25],
this.Letters[24]
});
if (this.TextBox1.Text.Equals(value))
{
MessageBox.Show(new string(new char[]
{
this.Letters[5],
this.Letters[11],
this.Letters[0],
this.Letters[6],
this.Letters[26],
this.Letters[8],
this.Letters[28],
this.Letters[11],
this.Letters[14],
this.Letters[21],
this.Letters[4],
this.Letters[28],
this.Letters[5],
this.Letters[14],
this.Letters[13],
this.Letters[25],
this.Letters[24],
this.Letters[27]
}));
}
}
valueとTextBoxの入力値を比較しています。valueは、
FONZY
なので、入力するとフラグが表示されます。
フラグは、
FLAG{I_LOVE_FONZY}

ASIS CTF Quals 2018 writeup Warm up

提示されたファイルを解凍すると次のようなCソースファイルができます。
#define M 37
#define q (2+M/M)
#define v (q/q)
#define ef ((v+q)/2)
#define f (q-v-ef)
#define k (8-ef)
struct b{int64_t y[13];}S;int m=1811939329,N=1,t[1<<26]={2},a,*p,i,e=73421233,s,c,U=1;g(d,h){for(i=s;i<1<<25;i*=2)d=d*1LL*d%m;for(p=t;p<t+N;p+=s)for(i=s,c=1;i;i--)a=p[s]*(h?c:1LL)%m,p[s]=(m*1U+*p-a)*(h?1LL:c)%m,*p=(a*1U+*p)%m,p++,c=c*1LL*d%m;}l(){while(e/=2){N*=2;U=U*1LL*(m+1)/2%m;for(s=N;s/=2;)g(136,0);for(p=t;p<t+N;p++)*p=*p*1LL**p%m*U%m;for(s=1;s<N;s*=2)g(839354248,1);for(a=0,p=t;p<t+N;)a+=*p<<(e&1),*p++=a%10,a/=10;}}z(n){int y=3,j,c;for(j=2;j<=n;){l();for(c=2;c<=y-1;c++){l();if(y%c==0)break;}if(c==y){l();j++;}y++;}l();return y-1;}main(a, pq) char* pq;{int b=sizeof(S),y=b,j=M;l();int x[M]={b-M-sizeof((short int) a),(b>>v)+(k<<v)+ (v<<(q|ef)) + z(v+(ef<<v)),(z(k*ef)<<v)-pow(ef,f), z(( (j-ef*k)|(ef<<k>>v)/k-ef<<v)-ef),(((y+M)&b)<<(k/q+ef))-z(ef+v),((ef<<k)-v)&y,y*v+v,(ef<<(q*ef-v-(k>>ef)))*q-v,(f<<q)|(ef<<(q*f+k))-j+k,(z(z(z(z(z(v)))))*q)&(((j/q)-(ef<<v))<<q)|(j+(q|(ef<<v))),y|(q+v),(ef<<ef)-v+ef*(((j>>ef)|j)-v+ef-q+v),(z(j&(b<<ef))&(z(v<<v)<<k))-(q<<v)-q,(k<<q)+q,(z(y)>>(ef<<v))+(z(k+v))-q,(z(z(k&ef|j))&b|ef|v<<f<<q<<v&ef>>k|q<<ef<<v|k|q)+z(v<<v)+v,(ef>>v)*q*z(k-v)+z(ef<<ef&q|k)+ef,z(k<<k)&v&k|y+k-v,z(f>>ef|k>>ef|v|k)*(ef>>v)*q,(ef<<k-ef<<v>>q<<ef*ef)-j+(ef<<v),z(ef*k)*z(v<<v)+k-v,z((z(k)<<z(v)))&y|k|v,z(ef<<ef<<v<<v)/ef+z(v<<ef|k|(b>>q)&y-f)-(ef<<q)+(k-v)-ef,k<<(ef+q)/z(ef)*z(q)&z(k<<k)|v,((z(y|j>>k*ef))%ef<<z(v<<v<<v)>>q<<q|j)/ef+v,(j-ef<<ef<<v*z(v>>v<<v)>>ef)/ef%z(k<<j)+q,z(k-v)+k|z(ef<<k>>v<<f)-z(q<<q)*ef>>v,(z(ef|y&j|k)%q|j+ef<<z(k|ef)%k<<q|ef|k<<ef<<q/ef|y/ef+j>>q)&k<<j|ef+v,84,z(v*ef<<ef<<q)*q%ef<<k|k|q-v,((z(20)*v)|(f>>q)|(k<<k))/ef-(ef<<(v*q+ef))-(k<<q)+z(k)-q};while(j--){putchar(x[M-v-j]);}printf(" From ASIS With Love <3\n");return 0;}
ファイルの冒頭に以下のincludeを追加して、ファイル名をwarmup.cに変更します。
#include <stdint.h>
#include <stdio.h>
gccでコンパイルします。
$ gcc warmup.c
できた実行ファイルを実行します。少し時間がかかりますが次のように結果が出力されます。
$ ./a.out
ASIS{hi_all_w31c0m3_to_ASISCTF} From ASIS With Love <3
フラグは、
ASIS{hi_all_w31c0m3_to_ASISCTF}
です。

苦しんで覚えるC言語
MMGames
秀和システム
2011-06-24


記事検索
ギャラリー
  • TetCTF 2023 NewYearBot
  • UUT CTF writeup Find The Password
  • UUT CTF writeup The Puzzle
  • Hack Zone Tunisia 2019 writeup Microscope
  • Hack Zone Tunisia 2019 writeup Welcome
  • SwampCTF 2019 writeup Brokerboard
  • SwampCTF 2019 writeup Leap of Faith
  • SwampCTF 2019 writeup Last Transmission
  • CBM CTF 2019 writeup Long road
カテゴリー