Reverse Challenge
08 June 2020
interkosenctf_2020
harmagedon
透過耐心reverse,發現他就是一個迴圈在執行,每次輸入一個字元,總共輸入10次。判斷依據為:
- 每次輸入前會給四個選項,就是從這4個char中選一個輸入,輸入不在這個選項的就exit(0)
- 輸入4個選項其中一個,這4個選項都分別可以看成一個小function,會去做一件事,修改rbx
- 4個選項就是code裡的一長串string中的某四個char($rbx + 0x60023f)
- 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