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) | 를 통해 넣어준다.
어셈블리어로 디컴파일해서 소스를 분석할 때 입력함수 이전을 잘 분석하면 입력 버퍼의 시작주소를 알 수 있다.
'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 |