More Related Content Similar to Capture the flag write up q13,q20,q21 for ss (20) Capture the flag write up q13,q20,q21 for ss1. 第7回 定例会
CTF Write up⼤会
CpawCTF Level 2 Q13,Q20,Q21
[Sep. 12, 2020]
福田 政広 情報処理安全確保⽀援⼠(第005565号)
5. Capture The Flag
Write up
CpawCTF Level 2 Q13隠されたフラグ
以下の画像には、実はフラグが隠されています。
目を凝らして画像を見てみると、すみっこに何かが…!!!!
フラグの形式はcpaw{***}です。フラグは小文字にしてください。
[Sep.12, 2020]
14. Capture The Flag
Write up
CpawCTF Level 2 Q20Block Cipher
与えられたC言語のソースコードを読み解いて復号してフラグを手にれましょう。
暗号文:cpaw{ruoYced_ehpigniriks_i_llrg_stae}
[Sep. 12, 2020]
16. 1.観察(cat,vi)
Linux環境下での観察です。
$ cat crypt100.c
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int main(int argc, char* argv[]){
int i;
int j;
int key = atoi(argv[2]);
const char* flag = argv[1];
printf("cpaw{");
for(i = key - 1; i <= strlen(flag);i+=key) for(j = i; j>= i - key + 1; j--) printf("%c", flag[j]);
printf("}");
return 0;
}
第1引数で与えられた文字列に対して、
第2引数で与えらえた大きさのブロック毎に
逆順にしているようです。
17. 2.試行(cc,bash)
Linux(fedora)環境下での試行です。
$ cc -o Q20 crypt100.c
$ for i in 1 2 3 4 5 6 7
> do
> echo -n $i” “
> ./Q20 ruoYced_ehpigniriks_i_llrg_stae $i
> echo
> done
1 cpaw{ruoYced_ehpigniriks_i_llrg_stae}
2 cpaw{urYoec_dheipngriki_s_illgrs_ate}
3 cpaw{ourecYe_diphingkiri_sll__grats}
4 cpaw{Your_deciphering_skill_is_great}
5 cpaw{cYourhe_deingip_skirrll_iats_g}
6 cpaw{ecYouriphe_dkiringll_i_sats_gr}
7 cpaw{decYourngiphe_i_skiris_grll_}
$
19. Capture The Flag
Write up
CpawCTF Level 2 Q21eversing easy!
フラグを出す実行ファイルがあるのだが、プログラム(elfファイル)作成者が出力
する関数を書き忘れてしまったらしい…
[Sep.12, 2020]
21. 1.観察(その1)
Linux環境下での観察です。
$ file rev100
rev100: ELF 32-bit LSB executable, Intel
80386, version 1 (SYSV), dynamically linked
(uses shared libs), for GNU/Linux 2.6.24,
not stripped
→ 実行できそうなので
$ rev100
cpaw{}
→肝心の文字がない。そこで
$ strings rev100
D$Fcpawf
D$J{
D$ y
D$$a
D$(k
D$,i
D$0n
D$4i
D$8k
D$<u
D$@!
→ 答えは cpaw{yakiniku!} っぽい
→念のため逆アセンブル...
22. 1.観察(その2)
strings結果
D$Fcpawf
D$J{
D$ y
D$$a
D$(k
D$,i
D$0n
D$4i
D$8k
D$<u
D$@!
T$Le3
gdbでの逆アセンブル結果
0x80484b2 <main+21>: movl $0x77617063,0x46(%esp) # cpaw のはず
0x80484ba <main+29>: movw $0x7b,0x4a(%esp) # {
0x80484c1 <main+36>: movl $0x79,0x20(%esp) # y
0x80484c9 <main+44>: movl $0x61,0x24(%esp) # a
0x80484d1 <main+52>: movl $0x6b,0x28(%esp) # k
0x80484d9 <main+60>: movl $0x69,0x2c(%esp) # i
0x80484e1 <main+68>: movl $0x6e,0x30(%esp) # n
0x80484e9 <main+76>: movl $0x69,0x34(%esp) # i
0x80484f1 <main+84>: movl $0x6b,0x38(%esp) # k
0x80484f9 <main+92>: movl $0x75,0x3c(%esp) # u
0x8048501 <main+100>: movl $0x21,0x40(%esp) # !
0x8048509 <main+108>: movw $0xa7d,0x15(%esp) # }+LF
0x8048510 <main+115>: movb $0x0,0x17(%esp) # NULL terminate
→ 0x77617063 を Cyberchef にて変換
24. 1.観察(その4)
0x8048515 <main+120>: movl $0x5,0x1c(%esp) ********
0x804851d <main+128>: lea 0x46(%esp),%eax # print "cpaw{"
0x8048521 <main+132>: mov %eax,0x4(%esp) #
0x8048525 <main+136>: movl $0x8048620,(%esp) #
0x804852c <main+143>: call 0x8048350 <printf@plt> #
0x8048531 <main+148>: cmpl $0x5,0x1c(%esp)
0x8048536 <main+153>: je 0x804855e <main+193>
0x8048538 <main+155>: movl $0x0,0x18(%esp)
0x8048540 <main+163>: jmp 0x8048557 <main+186>
0x8048542 <main+165>: mov 0x18(%esp),%eax
0x8048546 <main+169>: mov 0x20(%esp,%eax,4),%eax
0x804854a <main+173>: mov %eax,(%esp)
0x804854d <main+176>: call 0x8048390 <putchar@plt>
0x8048552 <main+181>: addl $0x1,0x18(%esp)
0x8048557 <main+186>: cmpl $0x8,0x18(%esp)
0x804855c <main+191>: jle 0x8048542 <main+165>
0x804855e <main+193>: lea 0x15(%esp),%eax # print "}"
0x8048562 <main+197>: mov %eax,0x4(%esp) #
0x8048566 <main+201>: movl $0x8048620,(%esp) #
0x804856d <main+208>: call 0x8048350 <printf@plt> #
肝心の文字が print されずに抜かされ
ているのは、
0x8048515 <main+120>: movl $0x5,0x1c(%esp)
で0x1c(%esp)に設定された数5が
0x8048531 <main+148>: cmpl $0x5,0x1c(%esp)
にて5と比較され等しいからなので、
それを5以外の数にすれば良い。
25. 2.解法
手順としては、gdb で rev100 の該当箇所にパッチを当てて実行。
$ gdb rev100(gdb で rev100 をロード)
…(初期メッセージ略)...
(gdb) b main (main にブレークポイント設定)
(gdb) run (実行開始)
main の先頭でブレークするので、
26. 2.解法(続き)
0x8048515 <main+120>: movl $0x5,0x1c(%esp)
(gdb) x/8bx 0x8048515
0x8048515 <main+120>: 0xc7 0x44 0x24 0x1c 0x05 0x00 0x00 0x00
(gdb) set *(unsigned char*)0x8048519=0x0e
(gdb) x/8bx 0x8048515
0x8048515 <main+120>: 0xc7 0x44 0x24 0x1c 0x0e 0x00 0x00 0x00
0x8048515 <main+120>: movl $0xe,0x1c(%esp)
(gdb) c