C언어 주소 값 brute force 하는 방법


예를 들어 0xbf***f64 을 brute force 하는 경우

bf, **, *f, 00 이므로, **는 for문을 통해 입력 가능하나, *f의 경우 00001111을 항상 적용 시켜 주어야 한다.
그러기 위해서 255(11111111)부터 시작하는 값을 ~ 문자를 통해 비트 반전을 시키고(255(11111111) -> 0(00000000)), & 값을 연산하여, 즉 00000000과 1111을 mask 할 경우 참이 아니므로, if문이 실행되지 않고 그 아래 구문, brute[i]에 255의 값, 즉 FF 문자가 들어가게 된다. 254의 경우 11111110 이며, 비트 반전 시 00000001 이다.
(이것과 1111을 마스크 할 경우 참이 된다.) 맨 마지막 비트와 mask의 1과 비트 연산 시 참이므로, 해당 if문이 실행되고 continue 문을 통해 253의 값으로 재 진행한다. 253 역시 11111101 이므로 00000010이 되고, mask의 00001111 연산 시 참이 되므로 252가 진행된다.


#include <stdio.h>

#include <string.h>


#define NOP 0x90

#define BUFSIZE 5

#define MASK 15


int main()

{

        int i, j, tmp;

        unsigned char brute[2];

        unsigned char buf[BUFSIZE];

        unsigned char comm[200];


        buf[3]= '\xbf';

        buf[0]= '\x64';

        buf[4]= '\x00';


        // 0xbf***f00 brute force

        for(i=255; i>0; i--){

                for(j=255; j>0; j--){

                        brute[0] = i;


                        // bit operate start, only pass brute[1] = *f

                       // *f가 아닌 것들은 모두 걸러낸다. 

if(~j & MASK){

                                //printf("not f is %x\n", j);

                                continue;

                        }

                        brute[1] = j;

                        memcpy(buf+1, brute, 2);

                        printf("%x %x %2x %x\n", buf[0], buf[1], buf[2], buf[3]);

                        printf("---------------------------------\n");

                        sleep(1);

                }

        }


        return 0;

}




+ Recent posts