과정

    [LOB] Level7: darkelf → orge (renew)

    [LOB] Level7: darkelf → orge (renew)

    orge /* The Lord of the BOF : The Fellowship of the BOF - orge - check argv[0] */ #include #include extern char **environ; main(int argc, char *argv[]) { char buffer[40]; int i; if(argc < 2){ printf("argv error\n"); exit(0); } // here is changed! if(strlen(argv[0]) != 77){ printf("argv[0] error\n"); exit(0); } // egghunter for(i=0; environ[i]; i++) memset(environ[i], 0, strlen(environ[i])); if(a..

    [LOB] Level5: orc → wolfman (renew)

    [LOB] Level5: orc → wolfman (renew)

    wolfman keyword : egghunter+bufferhunter /* The Lord of the BOF : The Fellowship of the BOF - wolfman - egghunter + buffer hunter */ #include #include extern char **environ; main(int argc, char *argv[]) { char buffer[40]; int i; if(argc < 2){ printf("argv error\n"); exit(0); } // egghunter for(i=0; environ[i]; i++) memset(environ[i], 0, strlen(environ[i])); if(argv[1][47] != '\xbf') { printf("st..

    [LOB] Level3: cobolt → goblin (renew)

    [LOB] Level3: cobolt → goblin (renew)

    goblin keyword : BoF+env+argv /* The Lord of the BOF : The Fellowship of the BOF - goblin - small buffer + stdin */ int main() { char buffer[16]; gets(buffer); printf("%s\n", buffer); } 0x01. Static Analysis 앞서 문제 cobolt와 다른점은 cobolt에서는 main함수의 argv로 입력값을 받았다면, 지금 문제는 gets를 이용하여 문제를 받는다. 따라서 값을 넘겨주는 방식의 차이만 있을 뿐 앞 문제와 풀이 과정은 동일하다. 0x02. Dynamic Analysis & Exploit cobolt 문제와 동일하게 환경변수에 쉘코드를 넣고 문제..

    [LOB] Level2: gremlin → cobolt (renew)

    [LOB] Level2: gremlin → cobolt (renew)

    Cobolt keyword : BoF+env 0x01. Static Analysis /* The Lord of the BOF : The Fellowship of the BOF - cobolt - small buffer */ int main(int argc, char *argv[]) { char buffer[16]; if(argc < 2){ printf("argv error\n"); exit(0); } strcpy(buffer, argv[1]); printf("%s\n", buffer); } 주어진 cobolt바이너리의 소스코드를 살펴보자.buffer의 크기는 16바이트인데 strcpy로 크기 제한없이 argv의 인자값을 buffer로 복사한다.전 문제인 gremlin과 마찬가지로 BoF 취약점이 존재한다..

    [LOB] Level1: gate → gremlin (renew)

    [LOB] Level1: gate → gremlin (renew)

    gremlin keyword : BoF 0x01. Static Analysis /* The Lord of the BOF : The Fellowship of the BOF - gremlin - simple BOF */ int main(int argc, char *argv[]) { char buffer[256]; if(argc < 2){ printf("argv error\n"); exit(0); } strcpy(buffer, argv[1]); printf("%s\n", buffer); } 제공되는 소스코드를 살펴보면 굉장히 단순한 프로그램이다.argv인자로 받은 값을 strcpy함수를 이용하여 buffer에 저장하는데, buffer의 크기는 256바이트이다.여기서 Buffer OverFlow 취약점이 존재한..

    [pwnable.kr][Toddler] blackjack 문제풀이

    [pwnable.kr][Toddler] blackjack 문제풀이

    blackjack 문제를 푸는 시간보다 blackjack 게임에 대해 이해하는게 더 어려웠던 문제....😒 nc로 접속해 보면 위 처럼 보여지는데, 1번을 누르면 게임이 시작되고, 2번은 게임 설명이다. 블랙잭에 대해 몰라서 2번을 눌러 설명을 보기로 했다.(사실 이걸 읽고도 이해하지 못해서 블랙잭을 아는 지인한테 물어봐서 겨우 이해했다... 제대로 이해 했는지는 모르겠지만😂)블랙잭은 나와 딜러 2명이서 진행하는 게임이다.처음 서로 1장씩 가지게 되고 베팅을 하게 된다.그리고 각 라운드마다 'Hit'과 'Stay'중 선택을 할 수있다.각 라운드마다 받은 카드 숫자의 합이 21과 더 가까운 사람이 승리하게 되며, 21을 넘어서면 패배가 된다.그리고 21이 되면 무조건 승리하게 된다.대충 블랙잭은 이렇게 흘..

    [pwnable.kr][Toddler] lotto 문제풀이

    [pwnable.kr][Toddler] lotto 문제풀이

    lotto #include #include #include #include unsigned char submit[6]; void play(){ int i; printf("Submit your 6 lotto bytes : "); fflush(stdout); int r; r = read(0, submit, 6); printf("Lotto Start!\n"); //sleep(1); // generate lotto numbers int fd = open("/dev/urandom", O_RDONLY); if(fd==-1){ printf("error. tell admin\n"); exit(-1); } unsigned char lotto[6]; if(read(fd, lotto, 6) != 6){ printf("err..

    [pwnable.kr][Toddler] coin1 문제풀이

    [pwnable.kr][Toddler] coin1 문제풀이

    coin1 문제를 요약하면 동전이 있는데 진짜 동전은 무게가 10이고, 가짜는 9이다.한번 실행되면 랜덤한 동전 개수(N)와 서버에게 물어볼 수 있는 카운트 수(C)가 설정되어 출력된다.만약 '0 1' 이라고 해서 보내면 서버는 첫번째 코인과 두번째 코인의 무게를 합한 값을 대답해준다.하나의 세트에는 1개의 가짜 동전이 존재하고, 동전을 찾으면 다시 새로운 세트가 만들어 지고 또 다시 가짜 동전 1개를 찾아야 한다.이런식으로 총 100개의 가짜 동전을 찾으면 되는데, 문제는 주어진 시간은 60초이다.따라서 자동화코드를 만들어서 찾는 방법 밖에없다. 가짜 동전을 최소한의 질의로 찾는 알고리즘부터 만들어야 한다.예를들어 서버로부터 N=400, C=10이라는 값을 받았다고 가정했을 때,코인을 0~200, 20..