문제: 아빠가 오늘 MD5 해쉬 충돌에 대해서 알려줬어. 나도 하고 싶어!
문제에서 주어진 포트에 ssh로 접속하면 3개의 파일이 주어진다. flag 파일은 권한이 없어 읽을 수 없고 col은 실행권한이 있다.
col 실행파일은 setuid가 설정되어있어 일반 사용자가 col 안에서 col_own의 권한을 가지므로 flag를 출력할 수 있는 권한이 있다.
#include <stdio.h>
#include <string.h>
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 main(int argc, char* argv[]){
if(argc<2){
printf("usage : %s [passcode]\n", argv[0]);
return 0;
}
if(strlen(argv[1]) != 20){
printf("passcode length should be 20 bytes\n");
return 0;
}
if(hashcode == check_password( argv[1] )){
system("/bin/cat flag");
return 0;
}
else
printf("wrong passcode.\n");
return 0;
}
위 코드는 col.c 코드이다. 플래그를 출력하기 위한 첫 번째 조건으로 hashcode와 check_password( argv[1] )이 같으면 플래그를 출력한다. 두 번째 조건은 입력한 문자열이 총 20바이트어야한다. check_password 함수에서 입력한 문자열에서 int형을 5번 읽어와서 총합을 반환한다. int 형은 4바이트이므로 20바이트를 5로 나누면 딱 들어맞는다.
전역변수 hashcode = 0x21DD09EC를 5개로 나누면 되므로 계산하면 0x06c5cec8을 4번 0x06c5cecc를 1번을 바이트 형식으로 입력하면 플래그를 출력한다.
./col `python -c 'print b"\xc8\xce\xc5\x06"*4+b"\xcc\xce\xc5\x06"'`
위 익스플로잇 코드를 입력하면 ``안에 있는 문자열들은 명령어로 해석되고 결과가 대신 들어가게 된다. 안의 명령어는 python -c 명령어를 이용해 파이썬 문법으로 ''안에 있는 문자열들은 명령어로 해석되고 결과가 대신 들어가게 된다. 따라서 20바이트가 입력되고 플래그가 출력된다.
'시스템 해킹 > pwnable.kr' 카테고리의 다른 글
[Pwnable.kr] cmd1 (0) | 2021.04.21 |
---|---|
[Pwnable.kr] mistake (0) | 2021.04.21 |
[Pwnable.kr] flag (0) | 2021.04.19 |
[Pwnable.kr] bof (0) | 2021.03.24 |
[Pwnable.kr] fd (0) | 2021.03.24 |
댓글