ADCTF2014 [10] xor
xor+shiftの暗号かぁー
712249146f241d31651a504a1a7372384d173f7f790c2b115f47
Source Code:
[c]
#include <stdio.h>
#include <string.h>
int main() {
char flag = "ADCTF_XXXXXXXXXXXXXXXXXXXX";
int len = strlen(flag);
for (int i = 0; i < len; i++) {
if (i > 0) flag[i] ^= flag[i-1];
flag[i] ^= flag[i] >> 4;
flag[i] ^= flag[i] >> 3;
flag[i] ^= flag[i] >> 2;
flag[i] ^= flag[i] >> 1;
printf("%02x", (unsigned char)flag[i]);
}
return 0;
}
[/c]
昔、某k○nctfの暗号問題を解くときに書いたプログラムをそのまま流用するか
[c]
include <stdio.h>
include <string.h>
unsigned long decXORShift_R(unsigned long,int);
int main(void){ int i; char flag = {0x71,0x22,0x49,0x14,0x6f,0x24,0x1d,0x31,0x65,0x1a,0x50,0x4a,0x1a,0x73,0x72,0x38,0x4d,0x17,0x3f,0x7f,0x79,0x0c,0x2b,0x11,0x5f,0x47,0x00}; int len = strlen(flag);
for(i=len-1; i>=0; i--){ flag[i]=decXORShift_R(flag[i],1); flag[i]=decXORShift_R(flag[i],2); flag[i]=decXORShift_R(flag[i],3); flag[i]=decXORShift_R(flag[i],4); if(i>0) flag[i] ^= flag[i-1]; } printf("%s",flag);
return 0; }
unsigned long decXORShift_R(unsigned long x,int t){ unsigned long y=x, z=0; for(unsigned long mask=((1U<<t)-1)<<(sizeof(long)*8-t);mask;mask>>=t){ z |= (y&mask)>>t; y = zx; } return y; }
[/c]
元のプログラムはand演算を加味したものも解けるようにしてあったのだけど、今回は必要ないから取り除きました
FLAG: ADCTF_51mpl3_X0R_R3v3r51n6
ADCTF2014 [09] qrgarden
ADCTF2014 [08] rotate
今日は問題文はございません
以下のファイルだけー
rotate.zip
エンコードに用いられたコードと、flag.jpgがエンコードされたflag.jpg.encが含まれているzipファイルが渡されます。
コードを見ると、やっていることは回転行列そのものを用いてますね
だったら、その逆行列にかけてやれば良いことなのだが、生憎何度の回転をかけたのかが分かりません。
とは言っても、keyは整数限定なので360回1度ずつ回すだけで全てです。
じゃあブルートフォースで良いよね?
その結果、keyは123°であることが分かりました。
上のプログラムを用いて、『solve_rotate.py decode flag.jpg 123』で走ります。
・・・うーん
何この変な絵
FLAG: ADCTF_TR0t4T3_f4C3
ADCTF2014 [07] reader
Read 10 times.
nc adctf2014.katsudon.org 43010
今日は連続してバーコードを読み取る問題のようですね
ひとまず送られてくるバーを数値に置き換えましょう
『▌』⇒10 『█』⇒10 『▐』⇒01 『 』⇒0
一つ目に来たコードはこんな感じ
▌▌██▐▐ █ ▌█ ▐▐▌▌█ █ ▌▐▐▐ ▐▌▌█▐ ▐▌█ ▌█▐▐ ▐▌▐▌▌█ ▌▐▐ ▐ ▌█ █▐▐▐▐█▌▌ 101011110 101001100 101100010 110101100 110010010 101000110 101101000 110110010 110101000 110011010 110010010 100010010 110011010 1010111101
スタートコードが101011110、ストップコードが1010111101のバーコードを調べると・・・
ありました!Code93です
対応表と見比べて、実装しましたー
実行して待ってれば、10回バーコードを読んでくれて、そのまま最後にフラグが投げられてきます
FLAG: ADCTF_4R3_y0U_B4rC0d3_R34D3r
ADCTF2014 [06] paths
ADCTF2014 [05] shooting
助けてJSおじさーん
今回のCTFには、チーム名tuat_mccで登録しているのですが、私ShiftCropsしかやってませんwww
チームメイトのicchyは別垢取ってるし、JSおじさんことモンジサンは不参加です
なので、結局助けを読んでも誰も来てくれないのでした。
さてさて、JSのシューティングゲームですね
一回で10000点入るようにしたり、ステージの条件分岐とか書き換えても出来ない。
どうしようかなぁ
・・・あれ、これって弾が当たっても死ななきゃ良いだけじゃない?
[js] var l = enchant.Class.create(j, { initialize: function(e, t) { j.call(this, e, t, Math.PI); this.addEventListener($UPcs4hr8oKgbbqAesfT(1), function() { //(player.within(this, 8)) ? (game.end()) : 0; }) } }) [/js]
最後のところで死亡判定をしているようなので、上のようにコメントアウト これで無敵だぜ!!
FLAG: ADCTF_1mP05518L3_STG
ADCTF2014 [04] easyone
reversing来ましたねー
あんまし得意ではないんですよ(汗
This is very easy crackme. easyone
どうやら64bitのelfのようですね
objdumpで見てみると、Flagを生成してるらしき部分がscanfの後に続きます
0x0000000000400625 <+56>: callq 0x4004f0 <__isoc99_scanf@plt> 0x000000000040062a <+61>: movb $0x37,-0x2a(%rbp) 0x000000000040062e <+65>: movb $0x33,-0x1e(%rbp) 0x0000000000400632 <+69>: movb $0x31,-0x25(%rbp) 0x0000000000400636 <+73>: movb $0x48,-0x29(%rbp) 0x000000000040063a <+77>: movb $0x37,-0x22(%rbp) 0x000000000040063e <+81>: movb $0x4f,-0x18(%rbp) 0x0000000000400642 <+85>: movb $0x35,-0x1c(%rbp) 以下略
生成が終わったところでブレイクポイントを仕掛け、そのままスタックを覗いてやればいい感じですね
(gdb) b *0x4006a2 Breakpoint 1 at 0x4006a2 (gdb) r Starting program: /home/yutaro/programs/CTF/adctf/easyone password: aaaa Breakpoint 1, 0x00000000004006a2 in main () (gdb) x/s $rbp-0x30 0x7fffffffded0: "ADCTF_7H15_15_7oO_345y_FOR_M3"
FLAG: ADCTF_7H15_15_7oO_345y_FOR_M3