printit을 함수포인터로 선언하고 호출합니다.
BOF를 이용해 함수포인터를 shell로 돌리면 되겠습니다.
gdb로 attackme를 열어봅니다.
shell()의 주소는 0x80484d0입니다.
main()을 뜯어봅니다.
printit의 주소를 0xfffffff0 (%ebp)에 저장하고
leave 하기 직전에 호출합니다.
buf에 접근하는 fgets 주변을 살펴보면 buf의 주소를 알 수 있습니다.
buf의 주소는 0xffffffc8 (%ebp)이고 덮어씌워야 할 곳의 주소는 0xfffffff0 (%ebp)입니다.
두 주소의 거리는 40(0x28)입니다.
아무값이나 40만큼 집어넣고 함수포인터를 shell의 주소로 덮어씌우면 됩니다.
공격해봅니다.
level17의 shell이 떨어졌습니다.