일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
- network
- 네트워크 보안
- 정보처리기사 필기 합격
- 슬퍼유
- 포렌식
- ZIP 파일구조
- slack space
- 윈도우 프로세스
- 생활코딩
- CTF-D
- 실기
- Multimeida
- 는 하지마...
- 디지털포렌식 with CTF
- 24시간의 전사
- 네트워크관리사2급
- 생활코딩 html
- 윈도우 프로세스 종류
- html
- 디지털포렌식
- 2022시작
- Multimedia
- blkls
- Window process
- ftz
- pythonchallenge
- N0Named
- memory
- vinetto
- disk
- Today
- Total
ssoL2 TISTORY
pwnable.kr [passcode] 본문
Mommy told me to make a passcode based login system.
My initial C code was compiled without any error!
Well, there was some compiler warning, but who cares about that?
#include
#include
void login(){
int passcode1;
int passcode2;
printf("enter passcode1 : ");
scanf("%d", passcode1);
fflush(stdin);
// ha! mommy told me that 32bit is vulnerable to bruteforcing :)
printf("enter passcode2 : ");
scanf("%d", passcode2);
printf("checking...\n");
if(passcode1==338150 && passcode2==13371337){
printf("Login OK!\n");
system("/bin/cat flag");
}
else{
printf("Login Failed!\n");
exit(0);
}
}
void welcome(){
char name[100];
printf("enter you name : ");
scanf("%100s", name);
printf("Welcome %s!\n", name);
}
int main(){
printf("Toddler's Secure Login System 1.0 beta.\n");
welcome();
login();
// something after login...
printf("Now I can safely trust you that you have credential :)\n");
return 0;
}
이 문제는 bof를 이용해서 주소지정자(&)없는 변수 조작+plt.got 조작 문제였음
가장 큰 문제는 scanf에 주소지정자(&)가 없다는 것
&가 없다는 의미는
scanf("%d", passcode1);
=> passcode1에 저장된 쓰레기 값이 주소가 되고, 그 주소에 입력한 정수를 저장하겠다는 의미
passcode1은 welcome()에 있는 name[100]의 bof로 조작 가능하므로,
passcode1을 내가 원하는 주소로 바꿀 수 있는거고, scanf로 결국 "내가 원하는 주소"에 "내가 원하는 걸" 넣을 수 있다는 의미
scanf 다음에 있는 fflush(stdin);도 잘 봐야하는게,
리눅스에서 잘 사용하지 않는 함수임 -> 이걸 이용해서 무언가 하라는 의미
-> scanf(password1)에서 "내가 원하는 주소"에 "내가 원하는 걸" 넣고, 바로 fflush가 실행되니까
fflush got 함수 주소에 system 실행 주소를 넣으면 되겠다~ (왜냐하면 system을 일으키는 것이 이 문제의 목표니까)
1. bof 주소 알기
아래는 welcome()의 name 위치 => ebp-0x70
아래는 login()의 passcode1 위치 => ebp-0x10
따라서 bof 거리는 0x70-0x10=0x60=96만큼 떨어져있다. 이만큼 쓱싹 채우고, 바로 다음 오는게 passcode1 변수임
2. passcode1에 채워넣을, 내가 원하는 주소 = fflush got 주소
아래와 같다~ 0x804a004
3. 마지막으로, 내가 원하는 주소에 채워넣을, 내가 원하는 내용!!!
fflush got주소에 system 넣기로 했쥬
system안에 있는 변수까지 알아야 하므로 call부분이 아닌 위에 부터 쓱싹해야죠 따라서 0x80485e3
준비는 끝났다~
payload는 dummy*96 + fflush got주소 + system실행 주소 일텐데,,,,,,,,,,,,,,,
이때, name 배열의 크기가 100 byte이므로 위처럼 쓰면 96 + 4 + 4로 100을 초과함 (주소는 총 4byte이니까)
따라서 dummy*96 + fflush got주소만 쓰고
그 다음에 직접 system실행 주소를 입력하면 되겠다.
그래서 쓱싹 쓰고나서 형광펜 친 것을 직접 입력한 상황이다.
갑자기 134514147이 왜나오냐면~ scanf로 내가 원하는 걸 입력할 때 "정수"로 받기 때문에(%d)
해당 system 주소 값을 정수로 변환해서 입력해야 정상적으로 입력이 완료된다~ 끝!!
'challenge > pwn' 카테고리의 다른 글
pwnable.kr [input] (0) | 2021.06.30 |
---|---|
pwnable.kr [random] (0) | 2021.06.30 |
[FTZ] LEVEL 18 풀이 (0) | 2021.02.23 |
[FTZ] LEVEL 17 풀이 (0) | 2021.02.23 |
[FTZ] LEVEL 16 풀이 (0) | 2021.02.01 |