728x90

func 함수의 if문을 충족시켜 쉘을 얻기 위해서는 overflowme 변수를  스택오버플로우를 통해 인자로들어간 0xdeadbeef를 cafebabe로 바꿔주어야 한다.

해당 바이너리를 gdb로 열어보자. 


빨간색으로 밑줄 쳐놓은 부분이 call 명령어를 통해 함수를 호출하는 부분들이다.

노란색 박스 부분은 주소를 mov 시켜주는 lea 명령어를 사용하는 부분이다. 즉 ebp-0x2c 주소를 eax에 넣는것이다.

이후 call함수로인해 eax가 인자로 들어가게되는데 call 0x650 <func+36>은 gets 함수이다.


ebp-0x2c 주소에 gets 함수를 통해 입력한 데이터가 들어간다는 것이다.

그리고 gets 함수는 표준입력을 받는다. argv와 같이 인자로 받는것이아니라 scanf 처럼 표준입력을 받는 함수이다.


이후 cmp DWORD PTR [ebp+0x8], 0xcafebabe

위 명령어가 shell을 얻기위해 충족해야하는 if문이다.


우리는 ebp-0x2c 주소에 데이터를 입력하기 시작하며 비교하는곳은 ebp+0x8부터 4바이트이다.

0x2c + 0x8 == 52이므로 52바이트만큼 더미값을 넣어주고 비교하는 문자열인 cafebabe를 입력해주면 된다.




표준입력의 경우 (python ~~~; cat) | 를 통해 넣어준다.

어셈블리어로 디컴파일해서 소스를 분석할 때 입력함수 이전을 잘 분석하면 입력 버퍼의 시작주소를 알 수 있다.

728x90

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

shellshock  (0) 2018.12.19
mistake  (0) 2018.12.19
flag  (0) 2018.12.19
collision  (0) 2018.12.19
fd  (0) 2018.12.18
728x90

인자로 argv 를 넣어줘야하며 그 인자의 길이는 20byte 여야 한다.


인자로 넣어준 argv를 check_password 함수 인자로 넣어주어 나오는 반환값과 hashcode의 값인 0x21DD09EC가 같아야 한다.


check_password 함수를 보면 int형 포인터로 값을 받아 각 4바이트씩 5개를 더해준다. 그럼 총 20바이트가 된다.

0x21DD09EC를 5로 나누면 0x06c5cec8이 나오는데 0x06c5cec8에 5를 곱하면 0x21DD09E8이 나온다.

4가 부족하므로 인자를 넣어줄때 0x06c5cec8*4+0x06c5cecc를 넣어주어 4바이트씩 5개 총 20바이트의 합이 0x21dd9ec가 되게한다.

코딩공부할 때 별로 신경쓰지않았던 자료형크기를 잘생각하자 

728x90

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

shellshock  (0) 2018.12.19
mistake  (0) 2018.12.19
flag  (0) 2018.12.19
bof  (0) 2018.12.19
fd  (0) 2018.12.18
728x90

문제 소스이다.



소스를 분석하면 argc < 2 이면 pass argv[1] a number\n 가 출력된다.

파일을 실행시킬 때 "./fd 인자값" 형태로 실행시켜 접근해야한다.

Atoi 함수는 문자열을 int형으로 변환 시켜 주는것이다.


fd 는 파일디스크립터로 파일을 관리하기 위해 운영체제가 정해놓는 것이다.

미리 정해진 파일 디스크립터는 0, 1, 2 가있다.

0 은 Standard input : 표준 입력을 가리킨다.

1 은 Standard output : 표준 출력을 가리킨다.

2 는 Standard Error : 표준 에러를 출력시킨다.


따라서 파일 오픈이나 소켓 생성시 부여되는 파일 디스크립터는 3번부터 시작된다.


read 함수의 첫번쨰 인자는 fd 즉 읽을 파일의 디스크립터

read 함수의 두번째 인자는 데이터를 저장할 공간, 위치

read 함수의 세번째 인자는 2번째 인자에 저장할 데이터의 크기이다.

해당 문제에서 read함수는 fd변수에있는 번호에 해당하는 파일을 32만큼 읽어서 버퍼에 저장해라 라는 함수가 된다.


strcmp( string1, string2) 함수의 경우 string1이 string2보다 크면 0보다 큰값을 반환한다.

string1 과 string2가 같으면 0을 반환한다.

string2가 string1 보다 크면 0보다 작은값을 반환한다.


if(!strcmp("LETMEWIN\n",buf))의 조건을 만족하기 위해서는 buf에 LETMEWIN을 입력해야한다.

그래야만 strcmp함수의 반환값이 0이 될것이고 !0 == 1이 되기때문에 if문 조건을 충족 시킬 수 있다.


소스분석에 맞게 buf에 LETMEWIN\n을 입력해주기위해서는 fd 값을 0으로 즉 Standard input으로 설정해주어 우리가 원하는 문자열을 입력할 수 있게 만들어주어야한다.

0x1234는 10진수로 4660이기 때문에 ./fd 4660을 입력하고 LETMEWIN을 입력하면 문제가 풀릴것이다.



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


fd 파일 디스크립터 : 운영체제에서 설정해주는 파일들을 관리하기 위한 파일 번호 이다.

atoi 함수는 문자열에 있는 정수를 int형으로 변환해준다. 반환에 실패할경우 0이 반환된다. 모든 공백문자는 무시하며 +, - 외의 다른 문자들이 문자열안에 있을경우 0이 반환된다. 또한 숫자 뒤에있는 문자들은 무시된다.

ex) atoi("a1234") == 0

atoi("1234a") == 1234




728x90

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

shellshock  (0) 2018.12.19
mistake  (0) 2018.12.19
flag  (0) 2018.12.19
bof  (0) 2018.12.19
collision  (0) 2018.12.19

+ Recent posts