728x90


flag 와 sh, tmp라는 단어가 필터링 되어있다.

우리가 넣은 인자를 필터링하고 이후 system 함수로 실행시킨다.



1. 와일드 카드



2. 환경 변수




728x90

'Wargame_writeup > Pwnable.kr' 카테고리의 다른 글

passcode  (0) 2018.12.21
horcruxes  (0) 2018.12.21
leg  (0) 2018.12.19
lotto  (0) 2018.12.19
random  (0) 2018.12.19
728x90

pc 레지스터에대한 이해가 필요하다.


cpu가 하나의 명령어를 수행할 떄 fetch -> decode -> execute의 과정을 거친다.

2개의 opcode를 실행하려면 fetch -> decode -> execute -> fetch -> decode -> execute 총 6번의 작업이 필요하다.

그러나 pipe line 을 통해서


1            2            3            4

   fetch        decode    execute    

fetch        decode    execute


위처럼 병렬적으로 단계를 수행하게 된다. 2개의 opcode를 실행할 때 4번의 작업으로 실행시키는 것이다.


pc 레지스터는 fetch할 주소를 담고 있다.

현재 명령어가 execute 즉 실행단계라면, 다음 명령어는 decode 단계이고, 그 다음 명령어는 fetch 단계이다.

그렇기 때문에 pc레지스터에는 실행시킬때 다다음번째 명령어의 주소를 담고 있다.



leg 문제풀이

key1


적용시켜보면 0x00008cdc에서의 pc레지스터에는 그 다음다음 번째 주소인 0x00008ce4가 들어가 있다.



key2

pc는 0x00008d04의 다음다음 주소인 0x00008d08이고, 다음 명령어를 보면 adds r3, #4가 있다.

그렇기때문에 key2는 0x8d0c 이다.


key3


lr 레지스터는 ret에 있는 주소값을 가져온다. 즉 key3 함수가 끝난후 실행될 opcode의 주소를 받아온다.

0x8d80이다.


key1 + key2 + key3 를 하면 총 합은 108400이다.



플래그획득



============================================================================================

새로보는 레지스터들이 많았다. 배경지식필요 공부 필요

어셈코드를 잘읽을 줄 알아야한다. -> 어셈코딩공부를 하자.


728x90

'Wargame_writeup > Pwnable.kr' 카테고리의 다른 글

horcruxes  (0) 2018.12.21
cmd1  (0) 2018.12.21
lotto  (0) 2018.12.19
random  (0) 2018.12.19
blackjack  (0) 2018.12.19
728x90


문제의 main함수 소스이다.

play함수를 분석해야한다.




소스코드를 보면 랜덤한 6바이트값을 lotto에 받아오고 해당값을 1~45로 맞춰준다.

이후 lotto 값과 우리가 직접 입력해주는 submit 값을 비교한다.




아스키코드표를 보면 1~45중에 직접 입력가능한 데이터는 !"@#$%^&*()- 이다.


문자열 비교하는 부분을 다시 분석해보면

위 부분이 취약하다.

반복문을 잘보면 lotto[i] 를 submit[0~5]까지 모두 검증한다.  위를 통해 lotto 6byte 문자열중 1개만 일치하면 match의 값이 6이 되면서  flag를 얻을 수 있다.



!"@#$%^&*()- 중에 *를 6개를 입력해준다.

lotto에 할당된 랜덤값중 하나가 *과 일치하나보다. flag가 출력된다.


==========================================================================================

로직을 잘 분석해야한다.




자료형을 잘봐야한다. submit 이 char로 선언되어있어 우리가 입력 할 수 있는 문자가 한정적이였다.

728x90

'Wargame_writeup > Pwnable.kr' 카테고리의 다른 글

cmd1  (0) 2018.12.21
leg  (0) 2018.12.19
random  (0) 2018.12.19
blackjack  (0) 2018.12.19
shellshock  (0) 2018.12.19
728x90

scp 명령어를 통해 파일들을 다운받는다.


문제 소스이다.  rand 함수를 통해 나온값과 직접 입력한 key값을 xor 연산하여 0xdeadbeef 가 나오게하면 flag가 출력된다.

위 문제를 풀기위해서 rand 함수를 통해 나온값을 확인하고 rand 함수의 반환값을 0xdeadbeef 와 xor 한 값을 직접 입엵을 통해 key에 입력시켜주면 flag를 얻을 수 있을 것이다. rand 함수에 seed 값이 없으니 실행시킬 때 마다 같은 값이 반환될것이다.


Rand()의 반환값이 rax에 저장된다. 값은 0x6b8b4567이다.

rand의 반환값과 0xdeadbeef를 xor 연산 시켜준다.




python을 사용하여 xor 연산값을 얻는다.


이후 random 프로그램을 실행시키고 해당 값을 입력시켜 주면 플래그를 얻을 수 있을것이다.


플래그 획득

728x90

'Wargame_writeup > Pwnable.kr' 카테고리의 다른 글

leg  (0) 2018.12.19
lotto  (0) 2018.12.19
blackjack  (0) 2018.12.19
shellshock  (0) 2018.12.19
mistake  (0) 2018.12.19
728x90

100만 이상을 벌어야 플래그를 준다.




메인함수를 보면 asktitle() 함수를 호출하는것을 알 수 있다.



==================================asktitle 함수 소스===================================

void asktitle() // Function for asking player if they want to continue

{

    char choice1;

    int choice2;

     

     printf("\n                 Are You Ready?");

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

     printf("\n                      (Y/N)\n                        ");

     scanf("\n%c",&choice1);

 

    while((choice1!='Y') && (choice1!='y') && (choice1!='N') && (choice1!='n')) // If invalid choice entered

    {                                                                          

        printf("\n");

        printf("Incorrect Choice. Please Enter Y for Yes or N for No.\n");

        scanf("%c",&choice1);

    }

 

 

    if((choice1 == 'Y') || (choice1 == 'y')) // If yes, continue. Prints menu.

    {

            system("cls");

            printf("\nEnter 1 to Begin the Greatest Game Ever Played.");

            printf("\nEnter 2 to See a Complete Listing of Rules.");

            printf("\nEnter 3 to Exit Game. (Not Recommended)");

            printf("\nChoice: ");

            scanf("%d", &choice2); // Prompts user for choice

            if((choice2<1) || (choice2>3)) // If invalid choice entered

            {

                printf("\nIncorrect Choice. Please enter 1, 2 or 3\n");

                scanf("%d", &choice2);

            }

            switch(choice2) // Switch case for different choices

            {  

                case 1: // Case to begin game

                   system("cls");

                    

                   play();

                                       

                   break;

                    

                case 2: // Case to see rules

                   system("cls");

                   rules();

                   break;

                    

                case 3: // Case to exit game

                   printf("\nYour day could have been perfect.");

                   printf("\nHave an almost perfect day!\n\n");

                   system("pause");

                   exit(0);

                   break;

                    

                default:

                   printf("\nInvalid Input");

            } // End switch case

    } // End if loop

    

             

 

    else if((choice1 == 'N') || (choice1 == 'n')) // If no, exit program

    {

        printf("\nYour day could have been perfect.");

        printf("\nHave an almost perfect day!\n\n");

        system("pause");

        exit(0);

    }

     

    return;

} // End function


함수를 따라가다보면 play 함수를 호출 하는 것을 알 수 있다.


play함수의 윗부분이다. dealer 함수와 betting 함수를 호출한다.



딜러의 점수를 계산해주는 함수이다.



betting 하는 금액을 처리하는 함수이다.


배팅하는 함수를 보면 player가 가진돈보다 많은 금액 베팅을 검사하는 부분이 있다.

그러나 해당 검증을 한번만 검증하기 때문에 취약점이 발생한다.


위 부분을 이용하기 위해서는 백만원 이상의 금액을 두번 입력해주면 성공적으로 금액을 베팅할 수 있다.

이후 해당게임을 한번만 이기면 성공적으로 플래그를 얻을 수 있다.



플래그 출력


정상적으로 작동하지만 내부에서 논리적인 오류를 일으킬 수 있다. 소스분석을 좀더 열심히 해야할 거 같다.





728x90

'Wargame_writeup > Pwnable.kr' 카테고리의 다른 글

lotto  (0) 2018.12.19
random  (0) 2018.12.19
shellshock  (0) 2018.12.19
mistake  (0) 2018.12.19
flag  (0) 2018.12.19
728x90


uid나 gid 모두 gid 즉 그룹권한으로 바꿔준다.






파일 권한을 보면 그룹 실행 권한에 s가 들어가 있다. 즉 실행시킬 때 그룹 실행 권한으로 실행된다는 것이다.

shellshock의 그룹권한을 보면 shellshock_pwn이고 flag의 그룹권한도 shellshock_pwn이다.

shellshock 바이너리 그룹 실행권한을 통해 flag를 shellshock_pwn 읽기 그룹권한으로 읽을 수 있다.



shellshock 취약점은 환경변수에 함수정의를 이용하여 함수정의 이후 원하는 코드를 입력 및 실행시키는 취약점 이다.

페이로드 : export x='() { :;}; /bin/cat flag'

./shellshock 를 실행시키면 플래그를 얻을 수 있다.






특정 프로그램 실행권한으로 다른 프로그램에 접근 할 수 있다.

환경변수에 함수가 정의 가능하다.

728x90

'Wargame_writeup > Pwnable.kr' 카테고리의 다른 글

random  (0) 2018.12.19
blackjack  (0) 2018.12.19
mistake  (0) 2018.12.19
flag  (0) 2018.12.19
bof  (0) 2018.12.19
728x90

password 파일의 fd를 fd변수에 저장시킨다.

이후 fd에 해당하는 파일을 read를 통해서 읽어들여 pw_buf에 저장한다.

pw_buf2 변수에는 직접 데이터를 입력시켜준다.  pw_buf2 값을 xor 연산 한값을 pw_buf와 비교하여 문자열이 일치하면 flag를 보여준다.



pw_buf2를 XOR 연산해주는 xor 함수입니다. 각각 문자열들을 XORKEY 값인 1 을 이용해서 XOR연산 해줍니다.




해당문제의 취약점은 연산자 우선순위를 이용한 것이다.

>, < 가 = 연산보다 우선순위로 연산을 하기 때문에 빨간색 상자

open("/home/mistake/password".0,RDONLY,0400)< 0 의 연산의 경우 

fd를 반환하는  open 함수에서 음수를 반환하지 않으므로 false 결과가 나온다.. false == 0

이후 fd에 해당 연산의 결과값인 0이 들어가게 되고


노란색 상자의 read함수의 fd에 0이 설정되어있기 때문에 우리가 원하는값을 입력시켜줄 수 있다. pw_buf 위치에

PW_LEN의 값은 10 이기때문에 10만큼 입력을 해줄 수 있다. 


분석한것을 정리해보면

pw_buf 값 입력가능

pw_buf2값 입력가능

pw_buf2 값을 1과 xor 연산한 값이 같으면 플래그를 준다.

입력 사이즈는 10


xor 연산은 두개의 비트가 다르면 1 이 나오고 같으면 0을 출력해준다.

그로므로 pw_buf의 값엔 1111111111을 입력해주고

xor 연산을 하는 pw_buf2에는 0000000000을 입력해주어


xor 연산후 1111111111이 나오게 한다.



728x90

'Wargame_writeup > Pwnable.kr' 카테고리의 다른 글

blackjack  (0) 2018.12.19
shellshock  (0) 2018.12.19
flag  (0) 2018.12.19
bof  (0) 2018.12.19
collision  (0) 2018.12.19
728x90

플래그 문제의 경우 소스파일을 주지않는다.

file 명령어를 통해 확인해본결과 64-bit 바이너리이며, stripped 되어있다.

stripped 이 되어있는 것은 함수의 심볼 정보를 모두 제거한다는 것이다.


해당바이너리를 IDA로 분석해본다.

start 함수 외에는 hexlay가 되지않는다 아마 암호화되어있어서 되지않는것으로 판단된다.

분석하다가 This file is packed with the UPX라는 문자열을 볼수 있다.

UPX로 packing 되어있다는 것이다.

UPX를 설치하고 d 옵션을 통해 packing을 풀어준다.

이후 flag 파일을 file 명령어를 통해 확인해본다.

stripped 이 해제되어있다.

gdb를 통해 분석한다.





0x6c2070에 flag가 있다고한다.

해당주소를 문자열로 출력하면 flag를 얻을 수 있다.



728x90

'Wargame_writeup > Pwnable.kr' 카테고리의 다른 글

shellshock  (0) 2018.12.19
mistake  (0) 2018.12.19
bof  (0) 2018.12.19
collision  (0) 2018.12.19
fd  (0) 2018.12.18

+ Recent posts