2019Hackingcamp-summer(only rev)
이번에도 참가는 못했지만 서버가 열린 뒤
하루동안 푼 리버싱 문제들을 정리해봤다.
Split Split Split
주어진 binary를 열어보면 아주 쉬운 루틴이있다.
enc="XSQ]@kC@\\YDOTQDQOCESSUCCm"
print(''.join(chr(ord(i)^0x10) for i in enc))
FLAG:HCAMP{SPLIT_DATA_SUCCESS}
M0000V
해캠당시에 노솔브였던 문제이고 내가 제일 처음 풀었다.
movobfuscator가 걸려있었는데 적당히 분석해보면 테이블이 눈에 보인다. 그 테이블을 이용해서 적당히 게싱+분석+뇌컴파일해보면 플래그를 얻을 수 있다.
enc="MFDHU{T777ol--s\.p\.ndubucdy~)}"
table=[5,7,3,16]
flag=[0]*len(enc)
p=0
for p in range(6):
flag[p]=ord(enc[p])^table[0]
flag[p]=ord(enc[p])
p+=1
for p in range(p,p+5):
flag[p]=ord(enc[p])-table[1]
flag[p]=ord(enc[p])
p+=1
for p in range(p,p+10):
flag[p]=ord(enc[p])+table[2]
flag[p]=ord(enc[p])
p+=1
for p in range(p,len(enc)):
flag[p]=ord(enc[p])^table[3]
flag[p]=ord(enc[p])
print(''.join(chr(i)for i in flag))
FLAG:HCAMP{M000oo00v_1s_1nterestin9}
참 쉽죠?
SimpleREV
이것도 1등으로 푼문제이다. 음수를 이용해서 연산을 하는데 적당히 분석해서 코드 짜주면된다.
arr=[171,60,199, 233, 19, 19, 7, 4, 117, 24, 185, 237, 251, 253, 226, 37, 120, 91, 140, 32, 220, 112, 199, 61, 89, 186, 238, 252, 196, 196, 43, 108, 61, 65, 61, 226, 18, 87, 121, 240, 225, 61, 15, 149, 253, 8, 143, 178, 19, 194, 172, 189, 14, 189, 63, 185, 55, 38, 143, 102, 161, 221, 207, 181, 196, 132, 232, 126, 104, 215, 121, 117, 197, 59, 28, 91, 232, 153, 236, 113, 88, 108, 68, 50, 250, 25, 201, 65, 50, 128, 170, 161, 75, 208, 38, 36, 25, 159, 79, 38, 220, 58, 14, 122, 104, 57, 104, 165, 131, 87, 255, 74, 143, 129, 220, 230, 105, 45, 107, 190, 144, 237, 199, 21, 138, 68, 0]
table=[88, 56, 121, 84, 244, 106, 125, 88, 178, 48, 33, 109, 125, 73, 12, 255, 31, 113, 2, 26, 65, 108, 53, 224, 73, 167, 70, 123, 5, 79]
tmp=[]
for i in range(0,len(arr)-1,2):
m=arr[i]+arr[i+1]
if m<0xa0:
tmp.append(m)
elif m<0xff:
tmp.append(0xff-m+1)
else:
tmp.append((0xff-arr[i])+(0xff-arr[i+1])+2)
for j in range(len(tmp)):
if tmp[j]>0xa0:
tmp[j]=0xff-tmp[j]+1
flag=""
for i in range(len(table)):
m=tmp[i]^table[i]
if m>0x7f:
m=0xff-m+1
flag+=chr(m)
print("HCAMP{"+flag+"}")
퍼블 먹으려고 막 짠 코드라서 많이 더럽다.
FLAG:HCAMP{Ah__y0u_admin_thanks_00_b0ssXD}
Eeeeasy Reversing
2등으로 푼 문제이다. flag.enc가 만들어진 시간을 이용해서seed값을 구하고 주어진 코드를 역연산하면 플래그를 얻을 수 있다.
from ctypes import *
import string
arr="ôÎ'èºÙÙ;+¨xtj/vB‹00[®Ëó @@Í|ãp¼©¸õ/:Ðä°"
libc=CDLL("msvcrt")
flag=""
seed=0xbab7
libc.srand(seed)
for i in range(len(arr)):
v5=(libc.rand()&0xff)
v6=libc.rand()&0xff
m=((libc.rand()&0xff)^v6^ord(arr[i]))-v5
if m>256:
print(hex(m))
flag+=chr(m)
if m<0:
m+=256
flag+=chr(m)
print(flag)
FLAG:HCAMP{Supper_Zzang⃑Zzang_Easy_Rever$ing!!@@}
인증할때는 플래그를 살짝 수정해주어야 한다.
FLAG:HCAMP{Supper_Zzang_Zzang_Easy_Rever$ing!!@@}
이번엔 1등으로 푼 문제 2개,2등으로 푼문제가 1개라서 기분이 좋다.