일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | |||||
3 | 4 | 5 | 6 | 7 | 8 | 9 |
10 | 11 | 12 | 13 | 14 | 15 | 16 |
17 | 18 | 19 | 20 | 21 | 22 | 23 |
24 | 25 | 26 | 27 | 28 | 29 | 30 |
- LOB
- Buffer Overflow
- System
- 해킹
- webhacking.kr
- system hacking
- Lord of BOF
- Spring MVC
- 워게임
- 정보보안기사 실기
- PWN
- OS
- Spring Framework
- BOF
- Spring
- Payload
- SQL
- Operating System
- hacking
- 정보보안기사
- 운영체제
- Pwnable.kr
- Shell code
- 웹해킹
- stack overflow
- 정보처리기사 실기
- wargame
- pwnable
- webhacking
- 네트워크
- Today
- Total
DongDD's IT
[pwnable.kr] collision 본문
[pwnable.kr] collision
Problem
문제에서 MD5 Hash 충돌에 대해서 들었다고 되어있고 자신 또한 그런 것을 하고 싶다라고 적혀있었다.
MD5 Hash에 관련된 문제인 것 같았다.
먼저 ssh로 접속해보았다.
col 실행 파일과 col.c 소스 코드 파일과 flag파일이 있었다. 먼저 소스 코드를 확인해보았다.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 | #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; } | cs |
먼저 argv를 받아 argc가 2보다 작은지 확인한다. 그 후에 argv[1]의 길이가 20인지 확인해 20이 아니라면 프로그램을 종료시킨다.
그 후에 hashcode(0x21DD09EC)값과 입력한 argv[1]을 인자로 하여 check_password() 함수를 실행해 반환하는 값이 같다면 if문으로 들어가 system("/bin/cat flag")를 실행해 flag를 띄어주는 방식으로 되어있다.
check_password()함수에서는 20bytes길이의 argv[1]을 인자로 받아 int* ip에 형변환하여 넣어준다.
즉, 4 bytes크기를 가진 int형 값 5개를 갖는 배열이 되는 것과 같다고 볼 수 있다.
그 후에 ip배열에 들어있는 5개의 값을 더해 이 값을 return한다.
이 값과 hashcode 값이 같다면 flag를 띄어주는 형식으로 되어있다.
Solution
이 문제는 단순한 16진수, 10진수 계산만 해주어 무난히 통과할 수 있었다.
0x21dd09ec의 16진수 값을 10진수로 바꾸어 계산했다.
0x21dd09ec를 10진수로 바꾸면 568134124가 나온다. 입력한 것을 5개의 int형으로 나누어 더해주기 때문에 이 값을 5로 나누면 된다.
하지만 568134124는 5로 정확히 나누어 떨어지지 않고 나머지 4가 남는다.
즉, 5개로 나누되 한개에는 4를 더하면 568134124의 값을 맞출 수 있다.
568134124를 5로 나누면 113626824가 나오고 이 값을 다시 16진수로 바꿔주면 0x6c5cec8로 나타내진다.
4개의 0x6c5cec8과 나머지 4를 더한 0x6c5cecc 1개를 payload에 입력해주면 int형으로 변환된 5개의 값이 더해져 0x21dd09ec값과 일치하여 flag를 볼 수 있을 것이다.
************** Answer & Flag **************
Payload = "\xc8\xce\xc5\x06"*4 + "\xcc\xce\xc5\x06"
flag : daddy! I just managed to create a hash collision :)
'Wargame > pwnable.kr' 카테고리의 다른 글
[pwnable.kr] flag (0) | 2018.03.09 |
---|---|
[pwnable.kr] bof (0) | 2018.03.07 |
[pwnable.kr] fd (0) | 2018.03.01 |
[pwnable.kr] lotto 문제 풀이 (0) | 2017.08.27 |
[pwnable.kr] cmd1 문제 풀이 (0) | 2017.08.12 |