반응형
문제를 보고 ssh로 접속해보면,
col.c가 컴파일 된 바이너리, col.c 소스코드 그리고 flag파일이 보인다.
col.c를 먼저 열어보면,
#include <stdio.h>
#include <string.h>
unsigned long hashcode = 0x21DD09EC;
unsigned long check_password(const char *p) //1바이트씩 20자리 입력 받은 문자열을
{
int* ip = (int*)p; //4바이트씩 총 5개로 나눔
int i;
int res=0;
for(i=0; i<5; i++){ // 4바이트씩 나눈 것을 전부 더함
res += ip[i];
}
return res; //더한 것을 리턴
}
int main(int argc, char *argv[])
{
if (argc < 2) // argument로 아무 값도 받지 않으면 예외처리
{
printf("usage : %s [passcode]\n", argv[0]);
return 0;
}
if (strlen(argv[1]) != 20) // argument의 길이는 20이여야 함
{
printf("passcode length should be 20 bytes\n");
return 0;
}
if (hashcode == check_password(argv[1])) // check_password의 return값이 0x21DD09EC라면 성공
{
system("/bin/cat flag");
return 0;
}
else
printf("wrong passcode.\n");
check_password(argv[1]);
return 0;
}
20자리 문자를 argument로 입력받고, 문자열들을 4자리로 끊어서 총 5개의 문자열을 정수로 바꾸어 전부 더한 값이
"0x21DD09EC" 이여야 하는 것이다.
argument 로 a 문자 20자리를 입력하니, 4자리씩 잘라 0x61616161과 다음 4자리 0x61616161이렇게 총 5번을 진행하면,
"0x21DD09EC" 이 나와야 비밀번호를 체크하는 함수를 통과할 수 있다.
"0x21DD09EC" 을 5로 나눠주면 소수로 떨어지기 때문에 몫과 나머지로 값을 연산해보면,
몫은 0x06C5CEC8, 나머지는 0x4가 된다.
여기서 첫번째로 걸리게 되는 문제는 0x06, 0xC5 등에 대응하는 아스키 문자를 argc 로 넣어줘야 하는데, 대응하는 문자가 없다. 그렇기 때문에 python을 사용하여 파이썬 연산 값을 argc로 넣어줘야 한다.
리틀엔디언을 사용함으로 변환하여 넣어주지만 이런식으로 넘기게 되면 문자열의 길이가 20자리가 넘게 되서 예외처리 당하게 된다.
그래서 0x06C5CEC8 4번과 나머지 4바이트 길이의 수를 대입하여 20자리를 맞출 수 있도록 해야한다.
5개로 나눈 것에 대한 몫을 4번 곱하고 나온 나머지는 0x6C5CECC
이대로 삽입해주면,
성공
반응형
'Pwnable 문제풀이 > Pwnable.kr' 카테고리의 다른 글
Pwnable.kr fd 풀이 (0) | 2022.05.05 |
---|
최근댓글