R136A1
[SWING] pwnable.kr collision 본문
ssh를 통해 서버에 접속한 뒤
ssh col@pwnable.kr -p2222 (pw: guest)
ls 를 쳐보면 flag 파일과 col 파일 보임
flag에 접근하려 보면 permission denied
col 파일 실행시키면 인자를 전달하라고 함
아무거나 치면 20글자 이상
col.c파일을 vim으로 열어서 코드 살펴보기
#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;
}
hashcode = 0x21DD09EC
if(hashcode == check_password(argv[1]))
system("/bin/cat flag");
인자로 들어온 값을 check_password 함수에 돌린 값이 hashcode와 일치하면 플래그를 출력함
check_password
char* → int * (char 문자열 데이터를 int 정수 데이터로 변경) 포인터 변환
만약 11111222223333344444 를 넣었다면 char 데이터는 index로 [0]~[20]까지 존재한다 (마지막 null)
이걸 4byte인 int 로 변환하게 되면 index로 [0]~[5]까지 존재하게 된다
[0] 1111 [1] 1222 [2] 2233 [3] 3334 [4] 4444 [5] null
for: int res에 ip[0] ~ ip[4] 까지 차례대로 더한다 (즉, 입력할 값은 숫자 데이터)
1111+1222+2233+3334+4444=12344
즉, 0x21DD09EC 가 되도록 하려면
(나누어떨어질 경우) □*5
(나누어떨어지지 않을 경우) □*5+△ (데이터는 20자리만 넣을수 있으므로 △는 마지막 index에 + 해서 넣는다)
계산기에서 21DD09EC % 5 해서 △먼저 찾고, 그것 뺀 값을 ÷ 5
06C5 CEC8
06C5 CEC8
06C5 CEC8
06C5 CEC8
06C5 CECC
를 넣으면 풀릴 것이다.
주의할 점은, linux에서 hex값을 넣으려면 little endian 방식으로 넣어줘야 하므로
C8CEC506*4+CCCEC506
파이썬 스크립트(print)를 사용하여 넣으면 확실하게 인자를 전달할 수 있다.
./col `python -c 'print "\xC8\xCE\xC5\x06"*4 + "\xCC\xCE\xC5\x06"'`
flag: daddy! I just managed to create a hash collision :)
'SWING > [21-1] SYSTEM' 카테고리의 다른 글
[SWING] 6주차 문제풀이 (ROPasaurusrex, Dreamhack 30) (0) | 2021.05.26 |
---|---|
[SWING] gdb 사용법과 실습 (0) | 2021.05.12 |
[SWING] setuid 개념 및 예제, Capability Leak (0) | 2021.05.05 |
[SWING] python pwntools 사용법 + 응용 예제 (0) | 2021.04.28 |
[SWING] 리눅스 메모리 구조 (0) | 2021.03.31 |