power-girl0-0

[pwnable] collision 풀이 본문

War game/pwnable.kr

[pwnable] collision 풀이

power-girl0-0 2022. 2. 9. 02:31
728x90

 

안녕하세요~~  (∩^o^)⊃━☆


0. 풀기 전, 공부하고 오기!

C언어 "포인터 배열"을 잘 이해하고 있다면, 쉽게 문제를 풀 수 있을 것이다.

 

1.  문제 

문제에서 주어진 C언어 코드이다.

#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;
}

 

2.  Code 분석

위 code를 분석해 보면, 아래와 같은 조건이 존재하는 것을 알 수 있다.

1. 입력받는 인자값이 20byte이어야한다.
2. check_password함수에서 인자값 20byte를 4byte씩 나눈 후, 그 값들을 더한 값이 return된다.
3. check_password함수의 return값이 hashcode변수에 존재하는 0x21DD09EC값과 일치해야 한다.

check_password의 인자로 argv[1]이 들어가있는 것을 볼 수 있다.

이는 인자로 입력받은 20byte가 저장되어있는 배열의 첫글자 주소값을 의미한다. ( 빈약하지만, 아래 그림 참고.. )

여기서, 중요하게 봐야할 코드는 char * 자료형이 int *자료형으로 형변환되는 것이다. 

이는 아래 그림과 같이, p는 4byte값을 가르키게 되는 것이다.

이후, ip의 인덱스 0 ~ 4까지 순서대로 더해진다. 

여기서 더해진 값이 0x21DD09EC일 경우, flag를 획득할 수 있는 것이다.

따라서, 입력값을 20byte입력해야하므로 0x21DD09EC에서 나누기 5를 하였다.

여기서 주의할 점은 "0x21DD09EC 나눈 값의 나머지 4가 남게된다."

즉, " (0x6C5CEC8 * 5) + 0x4 = 0x21DD09EC "가 되는 것이다.

 

그러면, 하나는 0x6C5CEC8에 0x04를 더한 값을 넣어주면 되는 것이다.

즉, "(0x6C5CEC8 * 4) + 0x6C5CECC = 0x21DD09EC"가 된다.

 

이를 리틀엔디안방식으로 바꿔서, 값을 입력하면 FLAG를 획득할 수 있다. 

 

3. Exploit Code

from pwn import *

p = ssh("col","pwnable.kr",port=2222,password="guest")
arg = b'\xC8\xCE\xC5\x06\xC8\xCE\xC5\x06\xC8\xCE\xC5\x06\xC8\xCE\xC5\x06\xCC\xCE\xC5\x06'
p1 = p.process(['./col',arg])
print(p1.recvuntil('\n').decode())

 

4. flag 획득

간단하게도 flag를 확인할 수 있는 방법도 존재한다.


2가지 방안으로 flag를 획득해보았습니다.

킥킥😁 다음문제 풀러 Bye ~~ (✿◕‿◕✿)

 

728x90

'War game > pwnable.kr' 카테고리의 다른 글

[pwnable] random 풀이  (0) 2022.02.13
[pwnable] flag 풀이  (0) 2022.02.12
[pwnable] input 풀이  (0) 2022.02.07
[pwnable] asm 풀이  (0) 2022.01.21
[pwnable] bof 풀이  (0) 2022.01.20
Comments