#binary
###Elf1 100点
問題ファイル
$file binary
binary: ELF 64-bit LSB executable, x86-64, version 1 (SYSV), dynamically linked (uses shared libs), for GNU/Linux 2.6.24, BuildID[sha1]=0x18dc5a21c6f0313a73840f9591328a75dbc1e624, not stripped
実行するとパスワードを聞かれる
パスワードが間違っていると何も起こらない
>```text
$./binary
*********************************
welcome to cracking challenge
*********************************
Enter you password: a
gdbで実行しながらexitしないように進めていく
0x400986 : test rax,rax
(gdb)set $rax=0
0x4008f6 : mov DWORD PTR [rbp-0x7e4],eax
(gdb)set $eax=0xc
0x400930 : test eax,eax
(gdb)set $eax=0x0
0x4007f0 : test eax,eax
(gdb)set $eax=0x0
このように分岐をスルーしていくとflagが表示される
Flag: ping-pong@
しかしこのflagは通らなかった。
なのでパスワードを求める
>```text
0x4007c3 <xxxxx+73>: call 0x400c10 <base64_decode>
ここで入力したものをbase64でデコードしている
>0x4007cf <xxxxx+85>: mov eax,0x400f40
RAX: 0x400f40 --> 0x6c460072696d6173 ('samir')
0x400f40にはsamirという文字列が入っている
>0x4007df <xxxxx+101>: repz cmps BYTE PTR ds:[rsi],BYTE PTR es:[rdi]
デコードしたものとsamirを比較している
>ということでsamirをbase64でエンコードしたものを入力してみる
>./binary
*********************************
welcome to cracking challenge
*********************************
Enter you password: c2FtaXI=
Flag: ping-pong@
これらを入力しても正解にならない
ping-pong@
samir
c2FtaXI=
おかしい。
flagをデコードしている場所を見てみる
0x400861 : call 0x400c10
このときの引数
arg[0]: 0x7fffffffdb10 ("cGluZy1wb25n")
arg[1]: 0xc ('\x0c')
arg[2]: 0x7fffffffdb40 --> 0x0
cGluZy1wb25n これをbase64でデコードするとping-pong
後ろについていた@がいらなかったらしい。 ということで
Flag ping-pong
---
###Elf2 100点
[問題ファイル](https://www.dropbox.com/s/adysvqvld0t1k7a/run?dl=0)
>```text
$file run
run: ELF 64-bit LSB executable, x86-64, version 1 (SYSV), dynamically linked (uses shared libs), for GNU/Linux 2.6.24, BuildID[sha1]=0xff97fa3797bb95b425e482fb0772c1accf55762a, not stripped
実行しても無反応
bokkenに入れてみる
とりあえずStringsを見ると
0x00400881 7 str.xxyyzz
0x00400878 9 str.Flags
0x0040086e 10 str..flag.txt
どこで使われているか確認
>```text
/ function: sym.xxyyzz (94)
| 0x00400697 sym.xxyyzz:
| 0x00400697 55 push rbp
| 0x00400698 4889e5 mov rbp, rsp
| 0x0040069b 4883ec10 sub rsp, 0x10
| 0x0040069f ba6c084000 mov edx, 0x40086c
| 0x004006a4 b86e084000 mov eax, str..flag.txt
| 0x004006a9 4889d6 mov rsi, rdx
| 0x004006ac 4889c7 mov rdi, rax
| 0x004006af e89cfeffff call dword imp.fopen
| ; imp.fopen()
| 0x004006b4 488945f8 mov [rbp-0x8], rax
| 0x004006b8 48837df800 cmp qword [rbp-0x8], 0x0
| 0x004006bd 750a jnz loc.004006c9
| 0x004006bf bf00000000 mov edi, 0x0
| 0x004006c4 e8a7feffff call dword imp.exit
| ; imp.exit()
| ; CODE (JMP) XREF 0x004006bd (sym.xxyyzz)
/ loc: loc.004006c9 (44)
| 0x004006c9 loc.004006c9:
| 0x004006c9 b978084000 mov ecx, str.Flags
| 0x004006ce 488b45f8 mov rax, [rbp-0x8]
| 0x004006d2 ba81084000 mov edx, str.xxyyzz
| 0x004006d7 4889ce mov rsi, rcx
| 0x004006da 4889c7 mov rdi, rax
| 0x004006dd b800000000 mov eax, 0x0
| 0x004006e2 e849feffff call dword imp.fprintf
| ; imp.fprintf()
| 0x004006e7 488b45f8 mov rax, [rbp-0x8]
| 0x004006eb 4889c7 mov rdi, rax
| 0x004006ee e81dfeffff call dword imp.fclose
| ; imp.fclose()
| 0x004006f3 c9 leave
\ 0x004006f4 c3 ret
flag.txtを開くことができたら何かを書き込むのかなー ということで何を書き込むかgdbで見てみる
(gdb)disas xxyyzz
Dump of assembler code for function xxyyzz:
0x0000000000400697 <+0>: push rbp
0x0000000000400698 <+1>: mov rbp,rsp
0x000000000040069b <+4>: sub rsp,0x10
0x000000000040069f <+8>: mov edx,0x40086c
0x00000000004006a4 <+13>: mov eax,0x40086e
0x00000000004006a9 <+18>: mov rsi,rdx
0x00000000004006ac <+21>: mov rdi,rax
0x00000000004006af <+24>: call 0x400550
0x00000000004006b4 <+29>: mov QWORD PTR [rbp-0x8],rax
0x00000000004006b8 <+33>: cmp QWORD PTR [rbp-0x8],0x0
0x00000000004006bd <+38>: jne 0x4006c9
0x00000000004006bf <+40>: mov edi,0x0
0x00000000004006c4 <+45>: call 0x400570
0x00000000004006c9 <+50>: mov ecx,0x400878
0x00000000004006ce <+55>: mov rax,QWORD PTR [rbp-0x8]
0x00000000004006d2 <+59>: mov edx,0x400881
0x00000000004006d7 <+64>: mov rsi,rcx
0x00000000004006da <+67>: mov rdi,rax
0x00000000004006dd <+70>: mov eax,0x0
0x00000000004006e2 <+75>: call 0x400530
0x00000000004006e7 <+80>: mov rax,QWORD PTR [rbp-0x8]
0x00000000004006eb <+84>: mov rdi,rax
0x00000000004006ee <+87>: call 0x400510
0x00000000004006f3 <+92>: leave
0x00000000004006f4 <+93>: ret
fprintfの引数を確認
>```text
(gdb) x/s 0x400878
0x400878: "Flag: %s"
(gdb) x/s 0x400881
0x400881 <__FUNCTION__.3311>: "xxyyzz"
Flag : xxyyzz が書き込まれるらしい これをsubmitしたら正解でした。
###PE 1 100点
問題ファイル
$file level1.exe
level1.exe: PE32 executable (console) Intel 80386, for MS Windows
実行する
>```text
****************
it's so easy
****************
enter the secret key: a
間違っていると何も起こらない
idaで中身を見る
stringsにFlag is: という文字があるのでそこを見る
0x00401A40でジャンプしなければ良さそう
OllyDbgで見る
00401704 /$ 55 PUSH EBP
00401705 |. 89E5 MOV EBP,ESP
00401707 |. 83EC 18 SUB ESP,18
0040170A |. A1 00934800 MOV EAX,DWORD PTR DS:[<&KERNEL32.IsDebug>; |
0040170F |. FFD0 CALL NEAR EAX ; |[IsDebuggerPresent
00401711 |. 83F8 01 CMP EAX,1 ; |
00401714 |. 0F94C0 SETE AL ; |
00401717 |. 84C0 TEST AL,AL ; |
00401719 |. 74 1D JE SHORT level1.00401738 ; |
0040171B |. C70424 E80300>MOV DWORD PTR SS:[ESP],3E8 ; |
00401722 |. A1 38934800 MOV EAX,DWORD PTR DS:[<&KERNEL32.Sleep>] ; |
00401727 |. FFD0 CALL NEAR EAX ; \Sleep
00401729 |. 83EC 04 SUB ESP,4
0040172C |. C70424 000000>MOV DWORD PTR SS:[ESP],0 ; |
00401733 |. E8 48460100 CALL ; \exit
00401738 |> C9 LEAVE
00401739 . C3 RETN
IsDebuggerPresentがあるので適当につぶし
0x00401a40をJNE SHORT 00401A98やNOPなどにするとflagがでる
Flag is :aiiajc(eik
---
###PE 2 100点
[問題ファイル](https://www.dropbox.com/s/3lgvscrqjmf8kkp/binary-pe.exe?dl=0)
>```text
$file binary-pe.exe
binary-pe.exe: PE32 executable (console) Intel 80386 (stripped to external PDB), for MS Windows
実行する
enter the key: a
間違っていると何も起こらない
idaのstringsを見る
![kore.png](https://qiita-image-store.s3.amazonaws.com/0/60391/cc9a0e3e-45b2-73aa-ca80-3080ca312434.png)
0x004014ACこのcmp命令があっていればflagが表示されるみたい
OllyDbgで値を確認する
![kore2.png](https://qiita-image-store.s3.amazonaws.com/0/60391/768702c7-3aa6-321f-9967-29491a96d0d0.png)
これを10進数にしたものを入力
>```text
enter the key: 1309495
Flag: 1309495
Flag : 1309495
###PE 3 200点
問題ファイル
$file bin.exe
bin.exe: data
ということでバイナリエディタにれる
>```text
00000000 4e 5a 90 00 03 00 00 00 04 00 00 00 ff ff 00 00 |NZ..............|
00000010 b8 00 00 00 00 00 00 00 40 00 00 00 00 00 00 00 |........@.......|
00000020 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 |................|
00000030 00 00 00 00 00 00 00 00 00 00 00 00 80 00 00 00 |................|
00000040 0e 1f ba 0e 00 b4 09 cd 21 b8 01 4c cd 21 54 68 |........!..L.!Th|
00000050 69 73 20 70 72 6f 67 72 61 6d 20 63 61 6e 6e 6f |is program canno|
00000060 74 20 62 65 20 72 75 6e 20 69 6e 20 44 4f 53 20 |t be run in DOS |
00000070 6d 6f 64 65 2e 0d 0d 0a 24 00 00 00 00 00 00 00 |mode....$.......|
00000080 50 45 00 00 4c 01 08 00 d8 3f 6b 54 00 1c 0a 00 |PE..L....?kT....|
00000090 1a 38 00 00 e0 00 07 03 0b 01 02 17 00 be 06 00 |.8..............|
先頭のNZをMZに直す
$file bin.exe
bin.exe: PE32 executable (console) Intel 80386 (stripped to external PDB), for MS Windows
実行する
>```text
*****************************************
welcome in cairo ctf
*****************************************
idaのstringsを見るとFlag:というものがある
.text:00401491 push ebp
.text:00401492 mov ebp, esp
.text:00401494 push ebx
.text:00401495 sub esp, 24h
.text:00401498 lea eax, [ebp-11h]
.text:0040149B mov ecx, eax
.text:0040149D call nullsub_2
.text:004014A2 lea eax, [ebp-18h]
.text:004014A5 lea edx, [ebp-11h]
.text:004014A8 mov [esp+4], edx
.text:004014AC mov dword ptr [esp], offset aFlagflag ; "flagflag"
.text:004014B3 mov ecx, eax
.text:004014B5 call sub_44473C
.text:004014BA sub esp, 8
.text:004014BD lea eax, [ebp-11h]
.text:004014C0 mov ecx, eax
.text:004014C2 call nullsub_3
.text:004014C7 lea eax, [ebp-0Ch]
.text:004014CA lea edx, [ebp-18h]
.text:004014CD mov [esp], edx
.text:004014D0 mov ecx, eax
.text:004014D2 call sub_444960
.text:004014D7 sub esp, 4
.text:004014DA lea eax, [ebp-10h]
.text:004014DD lea edx, [ebp-0Ch]
.text:004014E0 mov [esp+4], edx
.text:004014E4 mov [esp], eax
.text:004014E7 call sub_4013B0
.text:004014EC lea eax, [ebp-18h]
.text:004014EF lea edx, [ebp-10h]
.text:004014F2 mov [esp], edx
.text:004014F5 mov ecx, eax
.text:004014F7 call sub_445BC8
.text:004014FC sub esp, 4
.text:004014FF lea eax, [ebp-10h]
.text:00401502 mov ecx, eax
.text:00401504 call sub_445B38
.text:00401509 lea eax, [ebp-0Ch]
.text:0040150C mov ecx, eax
.text:0040150E call sub_445B38
.text:00401513 mov dword ptr [esp+4], offset aFlag ; "Flag: "
.text:0040151B mov dword ptr [esp], offset dword_472F80
.text:00401522 call sub_465CE4
.text:00401527 lea edx, [ebp-18h]
.text:0040152A mov [esp+4], edx
.text:0040152E mov [esp], eax
.text:00401531 call sub_465F20
.text:00401536 mov dword ptr [esp+4], offset asc_474075 ; "\n"
.text:0040153E mov [esp], eax
.text:00401541 call sub_465CE4
.text:00401546 lea eax, [ebp-18h]
.text:00401549 mov ecx, eax
.text:0040154B call sub_445B38
.text:00401550 jmp short loc_401596
デバッガで普通に実行していると0x00401491この処理に入ることができなかったので適当に飛ばしてあげる
自分はちょうど0x004010ffにいたのでそこから飛ばしてあげました。
>```text
*****************************************
welcome in cairo ctf
*****************************************
Flag: galfgalf
Flag: galfgalf
###CTF KeyGen 300点(バイナリ部分)
問題ファイル
$file KeyGen.exe
KeyGen.exe: PE32 executable (console) Intel 80386 Mono/.Net assembly, for MS Windows
.NETなのでデコンパイル
[JetBrains dotPeek](https://www.jetbrains.com/decompiler/)
>```csharp
using System;
using System.IO;
using System.Security.Cryptography;
using System.Text;
>namespace bruter
{
internal class Program
{
public static byte[] AES_Encrypt(byte[] bytesToBeEncrypted, byte[] passwordBytes)
{
byte[] bytes = Encoding.ASCII.GetBytes(Environment.UserName.ToLower().PadLeft(8, 'a'));
using (MemoryStream memoryStream = new MemoryStream())
{
using (RijndaelManaged rijndaelManaged = new RijndaelManaged())
{
rijndaelManaged.KeySize = 256;
rijndaelManaged.BlockSize = 128;
Rfc2898DeriveBytes rfc2898DeriveBytes = new Rfc2898DeriveBytes(passwordBytes, bytes, 1000);
rijndaelManaged.Key = rfc2898DeriveBytes.GetBytes(rijndaelManaged.KeySize / 8);
rijndaelManaged.IV = rfc2898DeriveBytes.GetBytes(rijndaelManaged.BlockSize / 8);
rijndaelManaged.Mode = CipherMode.CBC;
using (CryptoStream cryptoStream = new CryptoStream((Stream) memoryStream, rijndaelManaged.CreateEncryptor(), CryptoStreamMode.Write))
{
cryptoStream.Write(bytesToBeEncrypted, 0, bytesToBeEncrypted.Length);
cryptoStream.Close();
}
return memoryStream.ToArray();
}
}
}
> public static byte[] AES_Decrypt(byte[] bytesToBeDecrypted, byte[] passwordBytes)
{
byte[] bytes = Encoding.ASCII.GetBytes(Environment.UserName.ToLower().PadLeft(8, 'a'));
using (MemoryStream memoryStream = new MemoryStream())
{
using (RijndaelManaged rijndaelManaged = new RijndaelManaged())
{
rijndaelManaged.KeySize = 256;
rijndaelManaged.BlockSize = 128;
Rfc2898DeriveBytes rfc2898DeriveBytes = new Rfc2898DeriveBytes(passwordBytes, bytes, 1000);
rijndaelManaged.Key = rfc2898DeriveBytes.GetBytes(rijndaelManaged.KeySize / 8);
rijndaelManaged.IV = rfc2898DeriveBytes.GetBytes(rijndaelManaged.BlockSize / 8);
rijndaelManaged.Mode = CipherMode.CBC;
using (CryptoStream cryptoStream = new CryptoStream((Stream) memoryStream, rijndaelManaged.CreateDecryptor(), CryptoStreamMode.Write))
{
cryptoStream.Write(bytesToBeDecrypted, 0, bytesToBeDecrypted.Length);
cryptoStream.Close();
}
return memoryStream.ToArray();
}
}
}
> public static string EncryptText(string input, string password)
{
return Convert.ToBase64String(Program.AES_Encrypt(Encoding.UTF8.GetBytes(input), SHA256.Create().ComputeHash(Encoding.UTF8.GetBytes(password))));
}
> public static string DecryptText(string input, string password)
{
return Encoding.UTF8.GetString(Program.AES_Decrypt(Convert.FromBase64String(input), SHA256.Create().ComputeHash(Encoding.UTF8.GetBytes(password))));
}
> private static void Main(string[] args)
{
string str = Environment.MachineName.ToLower().Substring(0, 3).PadRight(10, 'Z');
string password = str + ((int) str[0] % 2 == 0 ? "E" : "O");
try
{
>Console.WriteLine(Program.DecryptText("PUIrT3Y/JtMMnOoxew7Mj937vKbBYgVPfOL5MdQ1VgE=", password));
Console.ReadLine();
}
catch (Exception ex)
{
Console.WriteLine("Try again");
}
}
}
}
mainにあるマシンネームと
AES_Decryptにあるユーザーネームを総当りすればデコードできそう
string str = Environment.MachineName.ToLower().Substring(0, 3).PadRight(10, 'Z');
byte[] bytes = Encoding.ASCII.GetBytes(Environment.UserName.ToLower().PadLeft(8, 'a'));
ユーザー名はバイナリの中に書いてある
>```text
C:\Users\Adham\Documents\CTF\bruter\bruter\obj\x86\Release\bruter.pdb
適当にマシーン名だけ総当り
マシンネーム先頭 ozi のときにうまくデコードできた
Flag: IWISHCTFSHADKEYGENS
PE4は解けませんでした。
問題ファイル
Exploit 1 も解けませんでした。
問題ファイル
178.63.58.69 3016
usr: ctf, pass: canyoudoit
flag in /home/flag/flag.txt