iT邦幫忙

第 11 屆 iThome 鐵人賽

DAY 18
1
Security

我搶到旗子了!30天CTF入門系列 第 18

Day18[Reverse] 魔鬼藏在細節裡

今天就是Reverse最後一天,會把兩顆星的題目做完,至於三顆星的題目大家可以自己去嘗試看看,若是之後有做出來會再補上


$ ./radix 100
Incorrect Password!

直接丟ghidra看看吧,題目的提示有說這跟Base64有關係,這是一種編碼方式,有興趣的可以自行google這裡不多做介紹

這邊只呼叫一個 check_password 的函式,進去後會看到很長一段程式碼,不過在組合語言碼的後面看到了一段很可疑的字串

這邊跟這段奇怪的字串做比較,再加上題目有提到Base64,把這段複製下來丟去解碼看看

果然,這段就是Flag,解CTF的時候其實也要仔細看看有沒有很明顯的線索,像這題就可以很快的找到Flag


$ ./activate 123
Please Provide a VALID 16 byte Product Key.

直接丟ghidra看看

這邊呼叫兩個函式 check_valid_keyvalidate_key,看起來目標應該是validate_key

這邊又呼叫了一個 ord的函式

綜合以上,可以看出來我們所輸入的字串只會有 0~9, A~Z 且長度為16

所以回到validate_key上,將輸入的字串經過一番運算(validate_key)之後算出來的值%36再與這個字串中的最後一個字元做比較,若相同就可以得到Flag

程式碼如下

int ord(char c){
	if(c<'0'||c>'9')
		if(c=>'A'&& c<='Z')
			return c-=55;
	else
		return c-=48;
	
}
int validate_key(char *key){
	int x,sum=0;
	for(int i=0;i<15;i++){
		x=ord(key[i]);
		sum=sum+i*(x+1);
	}
	x=ord(key[15]);
	return x==(sum%36);
}

前面15個字可以隨便舉都沒關係,那在這邊為了方便就全部都舉A,以下是程式碼

#include <stdio.h>
int ord(char c){
	if(c<'0'||c>'9')
		if(c>='A'&& c<='Z')
			return c-=55;
	else
		return c-=48;
	
}
int validate_key(){
	char key='A';
	int x,sum=0;
	for(int i=0;i<15;i++){
		sum=sum+(i+1)*(ord(key)+1);
	}
	return sum%36+55;
}
int main(){
	printf("%c\n",validate_key()); #O
}

所以只要在15個A後面加一個O就可以成功拿到Flag了

$ ./activate AAAAAAAAAAAAAAAO
Product Activated Successfully: picoCTF{k3yg3n5_4r3_s0_s1mp13_1295245566}

今天就是reverse的最後一篇了,接下來講的內容是Forensics的部份,因為reverse的題目大都比較長所以花比較多天在講reverse的部份,不過reverse的題目蠻有趣的,雖然充滿組合語言XD,不過也運用到很多實用的技巧以及程式撰寫的能力,接下來也請期待Forensics吧~


上一篇
Day17[Reverse] 電腦不夠快怎麼辦(3)
下一篇
Day19[Forensics] 最難的熱身題
系列文
我搶到旗子了!30天CTF入門30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言