-
level 16war game Write up/ FTZ 2018. 11. 14. 17:37
이 문제는 이전 문제들과 다르게 함수를 사용해서 코딩을 해놓았다.. 덕분에 황당함을 감추지 못했다고,,
간단하게 코드분석부터 해보면 main() 함수부터 crap 변수를 int형(4) 로 선언해주고 printit()함수의 호출 주소를 call에 저장하고 buf 변수를 char형(20)으로 선언했다. 그리고 fgets 함수를 이용해 표준입력을 받는다. 그 후에는 call 을 불러와 printit()함수를 호출한 후 프로그램이 종료된다.
여기서 생각해볼 수 있는것이 printit함수의 호출 주소를 저장하는 변수가 있는데 이곳을 shell() 함수를 호출하는 주소로 오염시켜버리면? 쉘을 얻을 수 있을것이다.
근데 지금 손목이 너무나도 아프다, 그렇다 이건 의식의 흐름이니 무시하고
gdb로 분석을 해보자.
함수가 3개이니 차례로 main()
shell()
printit()함수이다.
여기서 각 함수의 시작 주소는
main() -> 0x08048518
shell() -> 0x080484d0
printit() -> 0x08048500
어? 그럼 여기서 그냥 0x080484d0을 집어넣어주면 되는게 아닌가? 스택구조를 살펴보자!!!!!
(너무 귀찮다..)
다음과 같이 스택구조가 나왔다,
그럼 buf에서 void (*call)() 까지의 거리는 ?
main+6의 ebp-16에서 0x8048500을 불러오는것을 알 수 있다. 그럼 ebp-16에 0x080484d0을 넣어주면 되는데
ebp-56에서 fgets 함수가 시작되므로 그 사이의 값은 40byte라는 것을 알 수 있게된다.
buf 의 값이 20이니 더미는 20?이 될것이다.
그럼 아래와 같이 스크립트를 자면 되겠다.