FTZ Level16

Kail-KM
|2015. 5. 22. 16:50

문제확인


바로 문제를 확인하여 보자. main()에서와 보는 것과 같이 printit를 호출한다. 하지만 여기서 shell()을 호출하도록 유도를 해야 쉘을 획득 할 수 있다는 것을 알 수가 있다. 여기서 *call 은 포인터 변수임을 잊지 말아야 한다.


우선 GDB를 통하여 프로그램을 분석해본다면 아래와 같이 shell() , printit(), main()의 순으로 되어있는 것을 확인 할 수가 있다. 여기서 확인 할 것은 main() 함수에 0x38만큼 스택이 할당 되는 것을 확인 할 수가 있다. 


정확한 위치를 확인 하기 위하여 아래와 같이 입력을 하여 새로운 attackme_2를 만들어주자. 여기서 달라진 것이라 함은 crap에 "AAAA"라는 값을 주는 것으로 정확한 crap의 위치를 확인하기 위하여 일부러 넣어 준 것이다.


gdb를 통하여 확인을 한 결과 우선 buf에 20만큼의 "A"를 넣어준다. 그리고 우리는 buf[20]이 할당 될 경우 dummy가 20만큼 추가로 할당 되는 것을 이미 여러 문제에서 확인을 할 수가 있었다. 이제 여기서 buf[20] + Dummy[20] + 호출주소값[4] - Crap[4] - Dummy[8] - SFP - RET 가 할당 되는 것을 알 수가 있다. 이제 호출주소값이 전달되는 위치에 shell()의 주소를 넘겨주면 된다

<Uttackme에서의 메모리>


<실제 Attackme에서의 메모리>

공격



'Hacking > System Hacking' 카테고리의 다른 글

FTZ Level18  (0) 2015.05.25
FTZ Level17  (0) 2015.05.24
FTZ Level15 //Hard Coding, EGG  (2) 2015.05.21
FTZ Level14 //Distance  (0) 2015.05.17
FTZ Level13 //RTL, EGG  (0) 2015.05.13