SSTF2020 - CRACKME101
SSTF의 CRACKME101 문제를 풀어보겠습니다.

ida로 본 메인함수

rbp-78이 Dtd>=mhpNCqz?N!j(Z?B644[.$~96b6zjS*2t&
rbp-70이 scanf로 페스워드를 입력받는것

rbp-70(입력한 페스워드값)을 인자로 넣는것을 볼 수 있다.
똑같은 인자를 두번 전달함
(인자의 주소를 전달함)

rbp-18이 받아온 인자값이다.
rbp-20도 받아온 인자이다.
rbp-8부분에 u7fl(3JC=UkJGEhPk{q`/X5UzTI.t&A]2[rPM9 이거를 넣는거를 볼 수 있다.
페스워드값으로 strlen을 쓰는것을 볼 수 있다. (call sub_10b0 이 strlen이다.)
strlen의 리턴값만큼 for문을 돌리는 것을 볼 수 있다.
그리고 rbp-20[i] = rbp-8[i] ^(xor연산) rbp-18[i] 라고 볼 수 있다.
인자의 주소를 넘겨주었던 거기 때문에
입력한 페스워드의 값 자체가 바뀐다고 알 수 있다.

1
|
for(int i=0; i<strlen(입력페스워드)&& “Dtd>=mhpNCqz?N!j(Z?B644[.$~96b6zjS*2t&”[i] == 함수로인해바뀐페스워드[strlen(입력페스워드)-i-1;i++)
|
cs |
이라고 볼 수 있다. 그리고 for문을 다 끝내서 strlen(입력페스워드) 값이 i값이라 같아야 성공이 출력이 되니깐
“Dtd>=mhpNCqz?N!j(Z?B644[.$~96b6zjS*2t&”[i] == 함수로인해바뀐페스워드[strlen(입력페스워드)-i-1]
여기를 맞춰야 한다고 볼 수 있다.
그러면 생각해볼것은 저값들을 가지고 역연산을 해서 페스워드를 구하는 것이다.
xor의 역연산을 이용해보면 된다.

간단한 파이썬 코드로 구할 수 있다.
flag : SCTF{Y0u_cR4ck3d_M3_up_t4k3_7h15_fL49}