포너블 문제
ssh col@pwnable.kr -p2222
패스워드를 치고 문제에 들어왔다.
ls쳐서 플래그를 찾아야 되는걸 볼 수 있고
./flag를 치면 실행이 안된다.
aaaa를 썼을때 20바이트를 넘어야 되는걸 알수 있다.
12345를 4번씩 써주면 20바이트는 되지만 wrong passcode가 나온다.
코드보기
1. 매개변수가 필요한 만큼 들어오지 않으면 usage 사용법을 출력하고 반환한다.
if(argc<2){
printf("usage : %s [passcode]\n", argv[0]);
return 0;
}
2. 들어온 매개변수가 20byte인지 확인한다. 20바이트가 아니면 반환한다.
if(strlen(argv[1]) != 20){
printf("passcode length should be 20 bytes\n");
return 0;
}
3. hashcode와 check_password를 비교한다.
참이면 flag출력하고 거짓이면 wrong password를 출력한다.
if(hashcode == check_password( argv[1] )){
system("/bin/cat flag");
return 0;
}
else
printf("wrong passcode.\n");
check_password함수
unsigned long hashcode = 0x21DD09EC;
unsigned long check_password(const char* p){
int* ip = (int*)p;
int i;
int res=0;
for(i=0; i<5; i++){
res += ip[i];
}
return res;
}
입력받은 문자열을 받아온다. 그후 int형 포인터 변수를 가리키고 for(i=0;i<5;i++) for문을 돌면서 4바이트씩 잘라서 res변수에 더한다.
res변수를 4바이트씩 끊어서 더한이유는 int형 포인터이기 때문이다.
매개변수 더한것이 0x21DD89EC랑 같아야한다.
▶계산(1)
어떤값 * 4 + 0x21DD09EC - 어떤값 * 4를 해본다.
어떤값은 임의의 값으로 1로 해보면 hex 0x01로 표기가 가능하다.
네자리수로 만들어야 되니 0x01010101로 쓸 수 있다.
어떤값 *4 = 0x01010101 * 4 = 0x04040404
리틀엔디안을 사용하여 두개씩 잘라서 거꾸로 써줘야 한다.
E8 05 D9 1D
@정답
▶계산(2)
어떤값을 다른 값으로 해도 해결할 수 있는지 한번 해보겠다.
어떤값을 2로 바꾸어 보았다.
hex 0x02
0x02020202
0x02020202 * 4 = 0x08080808
'보안 > 포너블' 카테고리의 다른 글
포너블 Day5 GDB 실행 과정 (0) | 2021.05.12 |
---|---|
포너블 Day5 GDB설치, 명령어 (0) | 2021.05.12 |
포너블 Day3 리눅스 특수 권한 (0) | 2021.05.05 |
[포너블 Day2] pwntools (0) | 2021.04.28 |
[포너블 Day1]메모리 구조 (0) | 2021.03.31 |