일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
- 디지털포렌식
- pythonchallenge
- 포렌식
- 생활코딩 html
- CTF-D
- html
- 디지털포렌식 with CTF
- 실기
- 생활코딩
- 네트워크관리사2급
- 는 하지마...
- 윈도우 프로세스
- blkls
- slack space
- 윈도우 프로세스 종류
- Window process
- 슬퍼유
- 2022시작
- Multimeida
- 정보처리기사 필기 합격
- ZIP 파일구조
- vinetto
- network
- 24시간의 전사
- disk
- memory
- 네트워크 보안
- N0Named
- Multimedia
- ftz
- Today
- Total
ssoL2 TISTORY
pwnable.kr [collision] 본문
Daddy told me about cool MD5 hash collision today.
I wanna do something like that too!
Message-Digest algorithm 5
임의의 길이의 값을 입력받아서 128비트 길이의 해시값을 출력하는 알고리즘이다. 1991년 설계되었다.
MD5는 단방향 암호화이기 때문에 출력값에서 입력값을 복원하는 것은 할 수 없다. 같은 입력값이면 항상 같은 출력값이 나오고, 서로 다른 입력값에서 같은 출력값이 나올 확률은 극히 낮다(0은 아니며 발생할 수 있다.)
단방향 암호화이기 때문에 MD5 해시값에서 원래의 데이터를 찾아내는것은 불가능하며(원문을 해시 계산 과정에서 비트 단위로 박살내버린다), 크래커들은 "같은 MD5를 갖는 문자열", 즉 "충돌"(Collision)을 찾아내는 데 주력한다. 어쨌든 MD5값이 같으면 같은 문자열이라고 판단하기 때문이며 이는 모든 단방향 암호화에 통용되는 기법이다
#include
#include
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;
}
~
main
1. argc <2 >> 인자 1개 필요
2. 그 인자는 20byte여야해
3. argv[1]을 인자로 하는 check함수의 return값이 hashcode와 같으면 돼
4. check 함수를 보면
char 형으로 받은 거를 int형으로 변환해
그니까 a를 20byte하면 aaaaaaaaaaaaaaaaaaaa 이렇게 a가 20개인 20byte char형을
aaaa aaaa aaaa aaaa aaaa 이렇게 a가 4개인 4byte int형으로 5개로 쪼개지게 한다 이말인겨
5. for문에서 5번을 걸쳐서
쪼갠 int형을 5번 더한다는 걸 보면
내가 예상한대로 맞아 떨어진다는 걸 알수있음
그리고 이렇게 5번 더한게 hashcode와 같으면 돼
6. 따라서 hashcode를 5번 나눠봐
0x21DD09EC / 5 = 0x6C5 CEC8
0x6C5 CEC8 * 5 = 21DD 09E8
위 둘이 맞지 않아
음
EC가 E8보다 크니까
4개를 0x6C5 CEC8으로 하고 나머지 하나를 0x6C5 CEC8+(EC-E8)=6C5 CECC 로 하면 되지 않을까
더해보자
0x6C5 CEC8 * 4 + 0x6C5 CECC = 21DD 09EC
맞음 ㅊㅊ
그러면은 총 5개의 int가
0x6C5 CEC8
0x6C5 CEC8
0x6C5 CEC8
0x6C5 CEC8
0x6C5 CECC
막 ./col 뒤에 인자로
어떻게 저걸 넣어야 하나 고민했는데
도저히 생각 x
순간적으로 아 이문제는 pyhton payload로 딱 해서 해야겠구나
했더니 끝
col@prowl:~$ ./col `python -c 'print "\xC8\xCE\xC5\x06"*4+"\xCC\xCE\xC5\x06"'`
daddy! I just managed to create a hash collision :)
출처
'challenge > pwn' 카테고리의 다른 글
pwnable.kr [flag] (0) | 2019.07.09 |
---|---|
pwnable.kr [bof] (0) | 2019.07.08 |
pwnable.kr [fd] (0) | 2019.07.08 |
lob [Level2] gremlin > cobolt (1) (6) | 2018.11.04 |
lob [Level1] gate > gremlin (4) | 2018.11.03 |