Reverse Challenge

08 June 2020

interkosenctf_2020

harmagedon

link

透過耐心reverse,發現他就是一個迴圈在執行,每次輸入一個字元,總共輸入10次。判斷依據為:

  1. 每次輸入前會給四個選項,就是從這4個char中選一個輸入,輸入不在這個選項的就exit(0)
  2. 輸入4個選項其中一個,這4個選項都分別可以看成一個小function,會去做一件事,修改rbx
  3. 4個選項就是code裡的一長串string中的某四個char($rbx + 0x60023f)
  4. 10次後,rbx值要等同某個值,不同就失敗,相同就得到flag

reverse code大概是這種感覺

rbx = 0;
​
for(int i = 0 ; i < 11; i++){
	if(rbx == 0xb77c7c){
		print("you get the flag");
	}
	print("choice[%c%c%c%c]",s[rbx + 0x60023f])
	char n;
	scanf("%c",&n);
	if(n == s[rbx + 0x60023f + 0]){
		rbx += 0
	}
	else if(n == s[rbx + 0x60023f + 1]){
		rbx += 1
	}
	else if(n == s[rbx + 0x60023f + 2]){
		rbx += 2
	}
	else if(n == s[rbx + 0x60023f + 3]){
		rbx += 3
	}
	else{
		exit(0);
	}
	rbx += 1
	rbx <= 2
}
exit(0);

可以看出最後要等於0xb77c7c,所以就把它轉成bitstring(01)的形式,每兩個一組,依據bitstring決定當次輸入得char要是哪個,要執行哪個指令,ex: 如果是11的話,那就要輸入字元讓他能執行rbx += 2那個function,然後每次都會往左shift兩bit,最後這樣的模式就可以得到FLAG