문제확인
바로 문제를 확인하여 보자. 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 |