위는 pwnable.kr의 collision 문제이다.
이번에도 바이너리를 안 주고 ssh에 접속해서 문제를 보라고 하는거 같다.
ssh에 접속해서 문제 파일을 읽어보겠다.
#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;
}
위는 문제파일이다. 하나씩 읽어보면서 문제를 해석해보겠다.
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;
}
위를 보면 인자의 글자수가 20으로 맞추라는 내용도 알 수 있다.
if(hashcode == check_password( argv[1] )){
system("/bin/cat flag");
return 0;
}
else
printf("wrong passcode.\n");
return 0;
마지막으로는 check_password 함수에 인자를 전달하여 나오는 리턴값과 hashcode와 비교해서 맞으면 flag를 출력해주는 코드이다.
그렇다면 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;
}
이때는 데이터의 타입을 잘 알아야 문제를 해결할 수 있다.
처음에는 반복문을 왜 5번 돌릴까에 대한 의문을 가졌었다. 우리는 바이너리를 실행할 때 전달할 인자의 글자 수(byte 수)가 20이어야 한다는 것을 안다.
그렇다면 20 / 5 = 4
여기서 4라는 숫자를 보고 나는 한번에 눈치를 했다. 저 반복문 안에서는 int형 포인터를 배열로 하나씩 값을 꺼내서 res라는 변수에 넣는다는 것을.
쉽게 말하면 4바이트씩 꺼낸 데이터들을 res 변수에 반복문을 통하여 계속 더한다는 것이다.
그렇다면 이제 flag를 얻는 페이로드를 짜도록 하겠다.
위는 파이썬을 통하여 hashcode를 어떻게 5번 나누어서 연산을 해야할지 계산한 내용이다. 아래는 위의 내용을 바탕으로 hashcode를 분리한 것이다.
hashcode
= 0x21DD09EC
= 0x6c5cec8 + 0x6c5cec8 + 0x6c5cec8 + 0x6c5cec8 + 0x6c5cec8 + 4
= 0x6c5cec8*4 + 0x6c5cecc
마지막 연산 내용을 리틀엔디언 형식으로 작성 후 파이썬으로 전달하기 위해서 최종적으로 짠 페이로드는 다음과 같다.
./col `python -c 'print "\xc8\xce\xc5\x06"*4 + "\xcc\xce\xc5\x06"'`
해당 페이로드를 실행하여 flag값을 얻을 수 있었다.
'Write Up > pwnable.kr' 카테고리의 다른 글
bof - pwnable.kr (0) | 2023.07.03 |
---|---|
fd - pwnable.kr (0) | 2023.07.03 |