일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | |||
5 | 6 | 7 | 8 | 9 | 10 | 11 |
12 | 13 | 14 | 15 | 16 | 17 | 18 |
19 | 20 | 21 | 22 | 23 | 24 | 25 |
26 | 27 | 28 | 29 | 30 | 31 |
- 파이썬
- reversing.kr
- 2021
- 변수
- probgame
- 코드엔진
- 라업
- reversing
- 리버싱
- 시탭
- 워 게임
- 라이트업
- write-up
- 풀이
- write up
- PYTHON
- c언어
- 강의
- 드림핵
- ShaktiCTF
- vsCode
- 히공
- 라이트 업
- 리버스 엔지니어링
- Basic
- 해킹캠프
- ctf
- 뭉뭉
- web
- hackingcamp
히공
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}
'write up' 카테고리의 다른 글
제 24회 POC 해킹캠프 CTF Write up (0) | 2022.02.21 |
---|